JNI中 JNI_CreateJavaVM 会抛异常

ppol850564 2011-10-22 04:15:56
相关配置项:

/*设置初始化参数*/
//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()
jvm.dll!6d970a28()
jvm.dll!6d7f3bb6()
jvm.dll!6d7f5f68()
mfc100d.dll!CThreadSlotData::GetThreadValue(int nSlot=1) 行 266 C++
mfc100d.dll!CThreadLocalObject::GetData(CNoTrackObject * (void)* pfnCreateObject=0xffffffff) 行 420 + 0x11 字节 C++
mfc100d.dll!__localtime64_s() + 0x18346 字节 C++
javatest.exe!@ILT+210(__except_handler4)() Unknown
kernel32.dll!7c82f23b()

...全文
760 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ppol850564 2011-10-23
  • 打赏
  • 举报
回复
好低版本的JDK 难道真的高版本有问题?我试试吧 THX
柯本 2011-10-22
  • 打赏
  • 举报
回复
我用多个环境测试过
1. win7 64位,JDK 1.6 64位,CB2010及vs2008通过
2. winXP 32位,JDK 1.7 ,CB6,VC6 通过
3. winxp 32位 JDK 1.7 ,VS2010通过
ppol850564 2011-10-22
  • 打赏
  • 举报
回复
能够提供你使用的 组件吗? 和JDK版本吗?
ppol850564 2011-10-22
  • 打赏
  • 举报
回复
其实我也有点觉得运行环境问题,但是我用两个同事机子试过也一样。蛋疼死了,纠结了一天没结果
你给我测过 能跑 就可能我这边环境问题了
柯本 2011-10-22
  • 打赏
  • 举报
回复
我用vs2010测试下,没问题,可能的只有你环境的问题了(操作系统/编译器/JDK/JRE)
有条件的话,换个环境试试(我就是在虚拟机下测试的)
ppol850564 2011-10-22
  • 打赏
  • 举报
回复
....程序没问题 看过很多案例都基本这样写,而且源码都贴出来了。
开发环境是VS2010
JDK jdk1.7.0_01 源码上面写了
柯本 2011-10-22
  • 打赏
  • 举报
回复
1.我#1的程序试过有问题吗?
2.你的的什么编译器?VC6?
3.你的JDK及JRE版本是什么?
ppol850564 2011-10-22
  • 打赏
  • 举报
回复
参数上都试过了 已经吧网上 相关文章的配置都用过一遍 很纠结
柯本 2011-10-22
  • 打赏
  • 举报
回复
先试试单参数的程序,确定编译及JRE没问题,以下程序是肯定也以运行的


JavaVMOption options[1];
JNIEnv * env;
JavaVM * jvm;
JavaVMInitArgs vm_args;
options[0].optionString = "-Djava.class.path=.";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status == JNI_ERR)
{
cout<<"Can not create JVM"<<endl;
return -1;
}
else
cout << "OK" << endl;

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧