xcode 在Mac上使用dlopen加载libjvm.dylib时发出SIGSEGV信号

vxf3dgd4  于 2023-04-22  发布在  Mac
关注(0)|答案(1)|浏览(108)

我试图从Mac中的libjvm.dylib中获取指向JNI_CReateJVM的函数指针。Windows中的对应项正在工作。因此指向libjvm.dylib的指针(m_jvm_dll)不是null,即库的路径是正确的。此外,m_createJVM_Ptr也不是null。所以我肯定会获取指针。但一旦我使用m_createJVM_Ptr,Xcode中就会出现以下Thread1:signal SIGSEGV错误:

->  0x11566c2b4: movl   (%rsi), %eax
0x11566c2b6: leaq   0xf8(%rbp), %rsi
0x11566c2bd: vmovdqu %ymm0, (%rsi)
0x11566c2c1: vmovdqu %ymm7, 0x20(%rsi)
0x11566c2c6: vmovdqu %ymm8, 0x40(%rsi)
0x11566c2cb: vmovdqu %ymm15, 0x60(%rsi)

下面是罪魁祸首函数。

bool JVMInitializer::create_JVM(SettingDlg* inp_settingDlg){
wxString jvm_path;
wxString ij_path;
wxString bioformats_path;
//if (inp_settingDlg)
//{
//  jvm_path = inp_settingDlg->getJVMPath();
//  ij_path = inp_settingDlg->getIJPath();
//  bioformats_path = inp_settingDlg->getBioformatsPath();
//}

//Loading JVM library and methods.
jvm_path = "/Users/dev/Downloads/ImageJ/jre/lib/server/libjvm.dylib";
#ifdef _WIN32
m_jvm_dll = LoadLibraryW(jvm_path.ToStdWstring().c_str());
#else
m_jvm_dll = dlopen((const char*)jvm_path.mb_str(wxConvUTF8), RTLD_NOW);
#endif
if (m_jvm_dll == nullptr)
    return false;

#ifdef _WIN32
m_createJVM_Ptr = (decltype(&JNI_CreateJavaVM))GetProcAddress(m_jvm_dll, "JNI_CreateJavaVM");
#else
m_createJVM_Ptr = (CreateJavaVM_t*) dlsym(m_jvm_dll, "JNI_CreateJavaVM");
#endif
if (m_createJVM_Ptr == nullptr)
  return false;

using namespace std;    
JavaVMOption* options = new JavaVMOption[1];
//Geting absolute path to class file.
wxString exePath = wxStandardPaths::Get().GetExecutablePath();
exePath = wxPathOnly(exePath);
string imageJPath = "-Djava.class.path=" + exePath + GETSLASH() + "Java_Code" + GETSLASH() + getPathSeparator();
//imageJPath.append(ij_path + getPathSeparator());
//imageJPath.append(bioformats_path);

imageJPath.append(exePath + GETSLASH() + "Java_Code" + GETSLASH() + "ij.jar;");
imageJPath.append(exePath + GETSLASH() + "Java_Code" + GETSLASH() + "SlideBook6Reader.jar;");
imageJPath.append(exePath + GETSLASH() + "Java_Code" + GETSLASH() + "bioformats_package.jar;");

options[0].optionString = const_cast<char*>(imageJPath.c_str());

m_VMargs.version = JNI_VERSION_1_6;             // minimum Java version
m_VMargs.nOptions = 1;                          // number of options
m_VMargs.options = options;
m_VMargs.ignoreUnrecognized = false;     // invalid options make the JVM init fail

jint rc = m_createJVM_Ptr(&m_pJvm, (void**)&m_pEnv, &m_VMargs);
delete[] options;
if (rc != JNI_OK) {
    return false;
}
return true;
}

故障发生在jint rc = .....(第7个最后一行)。
以下是源文件的链接:jvminitializer.cppjvminitializer.h
因此,我运行代码时没有动态加载jvm库,它通过直接调用JNI_CreateJavaVM方法工作,但我希望它能动态加载。另外需要注意的是,我在imageJ中使用JRE进行动态加载,这是Java 1.8附带的。我认为这一信息可能是相关的。

cuxqih21

cuxqih211#

**JNI_CreateJavaVM()**故意引发(并捕获)访问冲突异常。

调试器(Visual Studio,XCode等)通常会在引发此异常时停止。
您可以将调试器配置为在引发访问冲突异常时不停止,或者忽略此异常并继续执行:

Visual Studio:按“继续”。
XCode:进入调试器窗口:pr h -s false SIGSEGV,然后按“继续”。

相关问题