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就新鲜出炉了;





  • 0 0
    原创粉丝点击