JNI 调用第三方dll 报错 RUNTIME ERROR R6031
来源:互联网 发布:网络直播遗体火化 编辑:程序博客网 时间:2024/06/10 04:50
最近几天有空,老大让我用JNI 调用第三方的C++ dll,这是一个人家用来控制超高频RFID读写器的dll, 光板的dll 加上文档说明, 于是我只知道如果c/c++调用的话只要动态链接调用就可以了,先LoadLibrary, 在GetProcessAddress,就可以获取函数指针;
但对java一窍不通的我马上晕了;JNI是什么鬼东西;还好,幸亏托福于这个信息化时代,很快在网上找到了一些JNI代码,如 http://www.open-open.com/home/space-37924-do-blog-id-5681.html 下了个eclipse,jdk 装好环境,照着敲起代码,并不复杂,javac,javah生成好.h文件后,直接在vs2010中建好java中调用的的dll名称的工程,将。h头文件加入,然后就是讲。h头文件中的方法在cpp文件中具体实现了;
由于我先前在win32中测试过那个dll,于是直接把win32 工程中的。h头文件和cpp文件拷贝过来,加进现在的工程;在新工程中简单调用一下win32中的函数就完成了一个java可调用的dll,然后编译就行;生成dll放在java工程与src平级的目录中;
在eclipse中运行毫无问题,结果也出来了,但是问题出现了,最有程序会突然报错,弹出提示框,
提示框标题: Microsoft visual C++ RunTime Library
RunTime Error!
D:\Program Files\Java\jdk1.8.0_65\bin\javaw.exe
R6031
-Attempt to initialize the CRT more than once
This indicates a bug in your application
于是一下子纠结了,网上一查,各说纷纭,方法一一试过来,比如去注册表里删除什么文件,结果一进去,本来就没有那个注册表文件了,花了一下午都没有解决,还好在网上有人提供了msdn连接 https://msdn.microsoft.com/zh-cn/library/ms173740(v=vs.100).aspx 的链接,资料一下子全了;
点进去一看,废了,一边下来,不明觉厉,就知道是加载动态库的死锁问题; 原因看不懂,直接去解决方案那一段,反复的看,就四个方面可能造成这一现象;
DllMain
静态初始值设定项
影响启动的用户提供的函数
自定义区域设置
第一,我没有动过dllmain这里,msdn提供的那些方法就用不到了,第二,我在win32项目考过来的cpp文件中有几个static 全局,于是把static全去掉,
第三和第四项也没有用到,在编译生成dll,结果放到java工程一运行还是报老错误,于是再反复看msdn,万幸msdn还有中文版的,仔细看静态初始值设定项那一段,终于发现全局和静态全局的初始化都有可能造成这个错误,于是直接取消全局变量的所有初始化,直接在代码中修改赋值;
重新编译运行;终于可以成功运行了;那么一个简单的可供java调用的dll就新鲜出炉了;
- JNI 调用第三方dll 报错 RUNTIME ERROR R6031
- jni 调用第三方dll
- jni 调用第三方dll学习心得
- 解决在调用第三方dll时因为runtime library不一致导致调用失败的方法
- java 调用第三方dll
- unity3d调用第三方dll
- eclipse jni 编译第三方.a文件报错
- 使用JNI技术实现java程序调用第三方dll文件的功能
- Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能
- 使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能
- JNI技术之Java调用C/C++编写的第三方dll-动态链接库
- 使用JNI调用第三方.so文件
- 关于JNI调用第三方静态库
- jni调用第三方静态库
- android JNI 调用第三方动态库
- Android-jni 调用第三方动态库
- 关于JNI调用第三方静态库
- 关于JNI调用第三方静态库
- Android PullToRefresh 源码分析
- Android 应用程序无响应(ANR)报错原因
- [Coursera]算法基础_Week9_考试_Q3
- Trees Made to Order
- threadpool——python线程池
- JNI 调用第三方dll 报错 RUNTIME ERROR R6031
- Space Ant
- LeetCode(173) Binary Search Tree Iterator解题报告
- 如何卸载Oracle 10g
- MongoDB学习第二弹
- Eclipse中删除此项// TODO Auto-generated method stub
- 联想笔记本无法进入BIOS怎么办?
- ContextLoaderListener与DispatcherServlet所加载的区别
- Tempter of the Bone