JNI中 JNI_CreateJavaVM 会抛异常

ppol850564 ppol850564 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
相关配置项:

/*设置初始化参数*/
//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()

...全文

相关推荐

JNI技术手册 c/c++调用java

目录 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

老黄忠

JNI接口开发

java调用native方法流程主要有两步: 1. 找到对应的方法 a) 动态绑定时load本地库时完成映射关系,运行时查找对应方法 native方法中实现JNI_OnLoad,返回JNI的版本号;如果native不实现,则由虚拟机生成默认实现。在加载本地库时调用 b) 静态绑定时,运行时按照特定规则查找对应的方法 2. 参数转换 a) 将java参数类型转换为jni提供的类型,包含:基础类型转换为jint,jlong,jboolean,jbyte等类型;String 转换为jstring类型;其他内置类型及自定义类型全部转换为jobject; 一般情况下,java调用native方法会比正常的函数调用效率低一个数量级,参数越多越复杂,对效率的影响越大。

zhangweictwt

C++ JNI.docx

。。。

G11176593

JNI经典教程-开发必备6.pdf

jni电子教程,中文版,非常实用

darkGer

Java Native Interface(JNI)官方学习手册

JNI官方学习手册(英文版)

Snasph
评论 9
收藏 已收藏
分享
返回顶部