JNI中 JNI_CreateJavaVM 会抛错误
JNI中 JNI_CreateJavaVM 会抛异常
相关配置项:
/*设置初始化参数*/
//disable JIT,这是JNI文档中的解释,具体意义不是很清楚 ,能取哪些值也不清楚。
//从JNI文档里给的示例代码中搬过来的
options[0].optionString = "-Djava.compiler=NONE";
//设置classpath,如果程序用到了第三方的JAR包,也可以在这里面包含进来
options[1].optionString = "-Djava.class.path=.;C:\\Program Files\\Java\\jdk1.7.0_01\\lib\\dt.jar;C:\\Program Files\\Java\\jdk1.7.0_01\\lib\\tools.jar";
//设置显示消息的类型,取值有gc、class和jni,如果一次取多个的话值之间用逗号格开,如-verb
//设置显示消息的类型,取值有gc、class和jni,如果一次取多个的话值之间用逗号格开,如-verbose:gc,class
//该参数可以用来观察C++调用JAVA的过程,设置该参数后,程序会在标准输出设备上打印调用的相关信息
options[2].optionString = "-verbose:NONE";
//设置版本号,版本号有JNI_VERSION_1_1,JNI_VERSION_1_2和JNI_VERSION_1_4
//选择一个根你安装的JRE版本最近的版本号即可,不过你的JRE版本一定要等于或者高于指定的版本号
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 3;
vm_args.options = options;
//该参数指定是否忽略非标准的参数,如果填JNI_FLASE,当遇到非标准参数时,JNI_CreateJavaVM会返回JNI_ERR
vm_args.ignoreUnrecognized = JNI_TRUE;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
异常部分:
// special version of CThreadSlotData::GetData that only works with
// thread local storage (and not process local storage)
// this version is inlined and simplified for speed
inline void* CThreadSlotData::GetThreadValue(int nSlot)
{
EnterCriticalSection(&m_sect);
ASSERT(nSlot != 0 && nSlot < m_nMax);
ASSERT(m_pSlotData != NULL);
异常-》ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);
ASSERT(m_tlsIndex != (DWORD)-1);
if( nSlot <= 0 || nSlot >= m_nMax ) // check for retail builds.
{
LeaveCriticalSection(&m_sect);
return NULL;
}
CThreadData* pData = (CThreadData*)TlsGetValue(m_tlsIndex);
if (pData == NULL || nSlot >= pData->nCount)
{
LeaveCriticalSection(&m_sect);
return NULL;
}
void* pRetVal = pData->pData[nSlot];
LeaveCriticalSection(&m_sect);
return pRetVal;
}
异常-》
javatest.exe 中的 0x78da3203 (mfc100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0xf78d6ec8 时发生访问冲突
堆栈
> mfc100d.dll!CThreadSlotData::GetThreadValue(int nSlot=-17891602) 行 250 + 0x9 字节 C++
mfc100d.dll!CThreadLocalObject::GetData(CNoTrackObject * (void)* pfnCreateObject=0x78d811b0) 行 420 + 0x11 字节 C++
mfc100d.dll!CThreadLocal<AFX_MODULE_THREAD_STATE>::GetData() 行 179 + 0xd 字节 C++
mfc100d.dll!AfxGetModuleThreadState() 行 477 + 0x11 字节 C++
mfc100d.dll!CWinThread::~CWinThread() 行 516 + 0x5 字节 C++
mfc100d.dll!CWinApp::~CWinApp() 行 760 + 0x12 字节 C++
javatest.exe!`dynamic atexit destructor for 'theApp''() + 0x28 字节 C++
msvcr100d.dll!doexit(int code=0, int quick=0, int retcaller=1) 行 567 C
msvcr100d.dll!_cexit() 行 408 + 0xb 字节 C
msvcr100d.dll!__CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=0, void * lpreserved=0x00000001) 行 313 C
msvcr100d.dll!_CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=0, void * lpreserved=0x00000001) 行 217 + 0x11 字节 C
ntdll.dll!7c94a352()
[下面的框架可能不正确和/或缺失,没有为 ntdll.dll 加载符号]
ntdll.dll!7c960e70()
ntdll.dll!7c960e4f()
kernel32.dll!7c8268a3()
kernel32.dll!7c826905()
msvcr71.dll!7c3638e2()
msvcr71.dll!7c3638c5()
msvcr71.dll!7c3638e2()
msvcr71.dll!7c36381d()
jvm.dll!6d9721ad()
jvm.dll!6d8e2cc9()
jvm.dll!6d9718d2()
msvcr71.dll!7c3627e4()
msvcr71.dll!7c3638e2()
msvcr71.dll!7c3627e9()
msvcr71.dll!7c36280c()
msvcr71.dll!7c362829()
相关配置项:
/*设置初始化参数*/
//disable JIT,这是JNI文档中的解释,具体意义不是很清楚 ,能取哪些值也不清楚。
//从JNI文档里给的示例代码中搬过来的
options[0].optionString = "-Djava.compiler=NONE";
//设置classpath,如果程序用到了第三方的JAR包,也可以在这里面包含进来
options[1].optionString = "-Djava.class.path=.;C:\\Program Files\\Java\\jdk1.7.0_01\\lib\\dt.jar;C:\\Program Files\\Java\\jdk1.7.0_01\\lib\\tools.jar";
//设置显示消息的类型,取值有gc、class和jni,如果一次取多个的话值之间用逗号格开,如-verb
//设置显示消息的类型,取值有gc、class和jni,如果一次取多个的话值之间用逗号格开,如-verbose:gc,class
//该参数可以用来观察C++调用JAVA的过程,设置该参数后,程序会在标准输出设备上打印调用的相关信息
options[2].optionString = "-verbose:NONE";
//设置版本号,版本号有JNI_VERSION_1_1,JNI_VERSION_1_2和JNI_VERSION_1_4
//选择一个根你安装的JRE版本最近的版本号即可,不过你的JRE版本一定要等于或者高于指定的版本号
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 3;
vm_args.options = options;
//该参数指定是否忽略非标准的参数,如果填JNI_FLASE,当遇到非标准参数时,JNI_CreateJavaVM会返回JNI_ERR
vm_args.ignoreUnrecognized = JNI_TRUE;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
异常部分:
// special version of CThreadSlotData::GetData that only works with
// thread local storage (and not process local storage)
// this version is inlined and simplified for speed
inline void* CThreadSlotData::GetThreadValue(int nSlot)
{
EnterCriticalSection(&m_sect);
ASSERT(nSlot != 0 && nSlot < m_nMax);
ASSERT(m_pSlotData != NULL);
异常-》ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);
ASSERT(m_tlsIndex != (DWORD)-1);
if( nSlot <= 0 || nSlot >= m_nMax ) // check for retail builds.
{
LeaveCriticalSection(&m_sect);
return NULL;
}
CThreadData* pData = (CThreadData*)TlsGetValue(m_tlsIndex);
if (pData == NULL || nSlot >= pData->nCount)
{
LeaveCriticalSection(&m_sect);
return NULL;
}
void* pRetVal = pData->pData[nSlot];
LeaveCriticalSection(&m_sect);
return pRetVal;
}
异常-》
javatest.exe 中的 0x78da3203 (mfc100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0xf78d6ec8 时发生访问冲突
堆栈
> mfc100d.dll!CThreadSlotData::GetThreadValue(int nSlot=-17891602) 行 250 + 0x9 字节 C++
mfc100d.dll!CThreadLocalObject::GetData(CNoTrackObject * (void)* pfnCreateObject=0x78d811b0) 行 420 + 0x11 字节 C++
mfc100d.dll!CThreadLocal<AFX_MODULE_THREAD_STATE>::GetData() 行 179 + 0xd 字节 C++
mfc100d.dll!AfxGetModuleThreadState() 行 477 + 0x11 字节 C++
mfc100d.dll!CWinThread::~CWinThread() 行 516 + 0x5 字节 C++
mfc100d.dll!CWinApp::~CWinApp() 行 760 + 0x12 字节 C++
javatest.exe!`dynamic atexit destructor for 'theApp''() + 0x28 字节 C++
msvcr100d.dll!doexit(int code=0, int quick=0, int retcaller=1) 行 567 C
msvcr100d.dll!_cexit() 行 408 + 0xb 字节 C
msvcr100d.dll!__CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=0, void * lpreserved=0x00000001) 行 313 C
msvcr100d.dll!_CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=0, void * lpreserved=0x00000001) 行 217 + 0x11 字节 C
ntdll.dll!7c94a352()
[下面的框架可能不正确和/或缺失,没有为 ntdll.dll 加载符号]
ntdll.dll!7c960e70()
ntdll.dll!7c960e4f()
kernel32.dll!7c8268a3()
kernel32.dll!7c826905()
msvcr71.dll!7c3638e2()
msvcr71.dll!7c3638c5()
msvcr71.dll!7c3638e2()
msvcr71.dll!7c36381d()
jvm.dll!6d9721ad()
jvm.dll!6d8e2cc9()
jvm.dll!6d9718d2()
msvcr71.dll!7c3627e4()
msvcr71.dll!7c3638e2()
msvcr71.dll!7c3627e9()
msvcr71.dll!7c36280c()
msvcr71.dll!7c362829()