我试图从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附带的。我认为这一信息可能是相关的。
1条答案
按热度按时间cuxqih211#
**JNI_CreateJavaVM()**故意引发(并捕获)访问冲突异常。
调试器(Visual Studio,XCode等)通常会在引发此异常时停止。
您可以将调试器配置为在引发访问冲突异常时不停止,或者忽略此异常并继续执行:
Visual Studio:按“继续”。
XCode:进入调试器窗口:
pr h -s false SIGSEGV
,然后按“继续”。