Java利用JNA调用dll动态函数库

原理说明:

因为c#代码是托管到.net平台上的,所以java不能直接调用c#代码,于是引入C++中间件,c++项目可以设置项目为clr公共运行时,从而通过引用的方式调用c#相应方法。而jna是可以直接调用c++生成的dll的,于是大致流程就走通了。c++调用写好的c#dll,java再调用c++生成的dll中间件,大致流程就是这样了。

(前面生成DLL文件,c++和c#全部工作有专门人完成)

 这个BUG是我遇到用时最久的问题。

报错了【无效的内存访问】,因为java找到了c++dll,但是没找到c#的dll,其中c++dll我们写的全路径名,可以直接找到,那么c#的dll怎么找呢。答案是将c#的dll复制到jdk的bin目录下,jvm就能找到了。

注意事项:

①java报错:Exception in thread "main" java.lang.Error: Invalid memory access

可能原因:

  1. c#dll没有复制到jdk的bin目录;
  2. java和c++之间数据类型不对应;

②java报错:Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'D:\vs workplace\X86InvokeTest\Release\X86CPPDlls': Native library (win32-x86/D:\vs workplace\X86InvokeTest\Release\X86CPPDlls.dll) not found in resource path

可能原因:

1、c++dll路径不正确,建议做test时用绝对路径,这样你在c++项目编译过后不用拷贝便可以在java程序里面直接调用;

2、jdk的平台和c++项目的平台不匹配,jdk是32位那么c++dll一定也是32位的,64位也同样;

3、还有可能是系统缺少依赖的DLL,我在开发过程中功能正常,但部署到服务器时,报了这个错,后经研究发现就属于此情况,服务器的win7系统缺少了部分依赖的DLL。可以使用一款叫做Dependency Walker的软件来查看DLL的依赖项,并将缺少的DLL复制到C:/Windows/System32目录下,即可。

③java报错Exception in thread "main" java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。

解决:当前的 JDK 是 64位的,而调用的  xxx.dll 代码是32位的,换成JDK32位并重新编译代码后,异常解决。

java报错:Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'D:\vs workplace\X86InvokeTest\Release\X86CPPDlls': Native library (win32-x86/D:\vs workplace\X86InvokeTest\Release\X86CPPDlls.dll) not found in resource path

解决:加载dll路劲不对,修改为访问本地路径

猜你喜欢

转载自blog.csdn.net/Temp_1998_H/article/details/122672106