java通过jna调用c++/c的.dll/.so动态库

friendgx 2014-05-05 10:32:15
java通过jna调用c++/c的.dll/.so库接口
1。通过jni技术可以实现java调用so文件(这个自己实现了,以前的日志也有,并没有用jni来调用dll文件,原因是自己对这个不熟啊,不知道怎样生成dll文件。。。。)。
2.使用jni的时候会显得很繁琐,因为要有许多函数的声明要相同,jna技术就可以省却这一点,拿到一个现成的dll,只要知道函数声明,就可以直接调用了(用jna还未实验调用so文件)。

下面介绍一下jna调用dll的过程。

1.导入jna.jar包,这个就不说了,下载一个就可以了。
2.主要代码:
import com.sun.jna.Library;import com.sun.jna.Native;public interface Net extends Library { Net lib = (Net)Native.loadLibrary("NetDvr2", Net.class); int NETDVR_startup();}//调用public class TestJna { public static void main(String[] args) { System.out.println(Net.lib.NETDVR_startup()); }}NetDvr2.dll放在工程的根目录下边即可。

可能出现的错误:
java.lang.UnsatisfiedLinkError: Unable to load library 'NetDvr2': ???????¨
原因是NetDvr2.dll(或者NetDvr2.so)还依赖于其他几个dll(so)文件,把他们一起拷到该java工程的根目录就行了。
查看一个dll文件所依赖的dll文件可以用Depends.exe。
需要以上任何文件的可以邮件我或留言。
...全文
2020 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
friendgx 2016-11-29
  • 打赏
  • 举报
回复
引用 8 楼 yezhiba 的回复:
楼主,你好!我有两个问题想请教。 1.我自己生成的dll文件还依赖于其他几个dll文件,他们都是系统里的dll文件。如何只调用我的dll文件,然后让编译器自己搜索本地系统把其他的dll调用起来?而不是把他们一起拷到该java工程的根目录。我只想烤我自己的dll文件到Java工程的跟目录下,其他都不想拷进来。 2.我根据楼主的方式,也拷进其他的依赖的dll文件了,但依然报错: A fatal error has been detected by the Java Runtime Environment: EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6b602b86,pid=5912,tid=5980 JRE version:7.0_25-b17 Java VM:Java HotSpot(TM) Client VM (23.25-b01 mixed mode,sharing windows-x86) Problematic frame: C [pthreadVC2.dll+0x2b86] pthread_mutex_unlock+0x16 Failed to write core dump.Minidumps are not enabled by default on client versions of Windows 求指导
这个有引用的关系需要放到一起的了,就把c++或者c语言的包(linux对应的.so或window对应的.dll文件)当中.jar包使用就可以了。看了你的报错,说的是VM运行环境异常。常见的VM运行环境异常有,64位的JDK装到了32位的window下或者64位的PC安装了32位的JDK.
沈小池 2016-10-24
  • 打赏
  • 举报
回复
楼主,你好!我有两个问题想请教。 1.我自己生成的dll文件还依赖于其他几个dll文件,他们都是系统里的dll文件。如何只调用我的dll文件,然后让编译器自己搜索本地系统把其他的dll调用起来?而不是把他们一起拷到该java工程的根目录。我只想烤我自己的dll文件到Java工程的跟目录下,其他都不想拷进来。 2.我根据楼主的方式,也拷进其他的依赖的dll文件了,但依然报错: A fatal error has been detected by the Java Runtime Environment: EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6b602b86,pid=5912,tid=5980 JRE version:7.0_25-b17 Java VM:Java HotSpot(TM) Client VM (23.25-b01 mixed mode,sharing windows-x86) Problematic frame: C [pthreadVC2.dll+0x2b86] pthread_mutex_unlock+0x16 Failed to write core dump.Minidumps are not enabled by default on client versions of Windows 求指导
friendgx 2016-05-25
  • 打赏
  • 举报
回复
JNA对JNI进行了封装,用起来比JNI简单多了。
friendgx 2016-05-25
  • 打赏
  • 举报
回复
.h头最好有对应关系,有代码么,具体代码才能说明白了。
haiyan315 2016-05-16
  • 打赏
  • 举报
回复
楼主你好,我想问下的是我用JNA 调用linux下的一个so文件,其又依赖于另一个的so库文件,那么我还需要对另一个库函数.h中的头文件进行map对应么?谢谢!
friendgx 2015-04-16
  • 打赏
  • 举报
回复
@peak-power 可问题是我已经把其他的dll放到java工程的目录下了,还是报错 无法加载。。。,不知道怎么回事?楼主有其他见解吗? 百度下jna引用C++吧,再不行把接口引用代码贴出来看看(如代码可以放开,不涉及机密)。
peak-power 2015-04-14
  • 打赏
  • 举报
回复
终于看到一点希望了,可问题是我已经把其他的dll放到java工程的目录下了,还是报错 无法加载。。。,不知道怎么回事?楼主有其他见解吗?
欢乐豆 2014-11-06
  • 打赏
  • 举报
回复
按照楼主说的方法试过啦,引用的dll没有引用别的dll,但是一直报错,加载不到对应的模块,这个是什么原因啊,求解
日知己所无 2014-05-05
  • 打赏
  • 举报
回复
JNI可以参考《JAVA 核心技术 卷II:高级特性》最后一章,熟悉了就不觉得复杂了

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧