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()

...全文
1073 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;

目录 I. 目录 1 II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 四 最后补充 11 III. java c/cpp互相调用实例(姊妹篇之二)——c/cpp调用java 11 一、 编写java代码 12 二、 编译java代码 12 三、 编写 C/C++ 代码 13 四、 运行exe 18 IV. Java JNI 编程进阶 18 一、 解决性能问题 18 二、 解决本机平台接口调用问题 19 三、 嵌入式开发应用(JNI小例子) 20 1、 新增一个基础类 22 2、 定义新类继承基础类 23 3、 编写调用类 23 4、 新增两个本地方法 24 5、 修改 RunMain 类 25 6、 新增一个方法处理java对象 26 7、 新增一个方法处理数组 29 8、 改写RunMain 32 四、 参考资料: 33 V. Eclipse+CDT+MinGW 进行JAVA调用C/C++ 34 一、 安装eclipse3.2。 34 二、 安装MinGW。 34 1、 下载MinGW 34 2、 安装 34 3、 安装版本 34 4、 选择安装的编译器 34 5、 选择安装路径,下一步 35 6、 等待下载软件 35 三、 MinGW的环境变量设置 35 1、 设置Path 35 2、 设置C_INCLUDE_PATH 35 3、 设置CPLUS_INCLUDE_PATH 35 四、 做一个小技巧修改 35 五、 安装CDT插件 36 1、 下载CDT插件 36 2、 安装CDT插件 36 六、 简单介绍CDT的使用吧 36 1、 新建一个C++项目 36 2、 输入New Project名字 36 3、 给项目新建一个的源文件 36 4、 接着出现文件添加的窗口,在File Name栏里面写上文件名 36 5、 编辑hello.cpp 37 6、 添加一个编译命令 37 七、 让我们开始进入真正的工作吧! 38 The Java side 38 1、 建立Java工程JavaHello,编写java类 38 2、 用命令生成头文件 38 The C side-Compiling the Library 40 1、 建立标准C工程Cpro,并生成dll文件 40 1) 将生成的头文件test_Hello.h拷贝到C工程Cpro下 40 2) 编写C类Hello.c,内容为: 40 3) 在C工程Cpro下建立hello.def文件(用于定义导出的函数),内容为: 40 4) 在C工程Cpro下建立makefile文件,内容为: 40 5) Make Targets 40 6) Make Targets视图下双击step1,在C工程Cpro下生成hello.o 文件。 41 7) Make Targets视图下双击step1,在C工程Cpro下生成hello.dll 文件。 41 2、 JAVA调用DLL 41 1) 将hello.dll拷贝到Java工程JavaHello下。 41 2) 运行Hello.java,则可以看到输出结果: 41 1) 将Hello.c改为Hello.cpp 41 2) 将makefile内容改为: 41 3) 其他的几乎都不用改变也可以。 42 评论: 42 VI. c++如何调用java程序 51 DemoMain.java内容如: 51 采用vc6++ IDE,采用JNI技术实现。 51 1、 编译时 51 2、 运行时 51 程序的关键在 53 VII. JNI 53 一、 定义 53 二、 设计目的 54 三、 书写步骤 54 1) 编写java程序:这里以HelloWorld为例。 54 2) 编译 55 3) 生成扩展名为h的头文件 55 4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。 56 5) 生成动态库 56 6) 运行程序 java HelloWorld就ok. 56 四、 调用考虑的问题 56 1) java和c是如何互通的? 57 2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是bytearray的话,作如下处理得到buffer: 58 VIII. C/C++调用JAVA类 58 一、 加载虚拟机: 59 二、 获取指定对象的类定义: 59 三、 获取要调用的方法: 59 四、 调用JAVA类方法: 60 五、 获得类属性的定义: 60 六、 数组处理: 60 七、 异常: 60 八、 多线程调用 61 Java代码 61 命令行运行:javap -s -p MyTest ,输出: 62 C代码testjava.c: 62 编译: 65 运行结果: 65

24,852

社区成员

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

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