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路劲不对,修改为访问本地路径

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值