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。
需要以上任何文件的可以邮件我或留言。

解决方案 »

  1.   

    JNI可以参考《JAVA 核心技术 卷II:高级特性》最后一章,熟悉了就不觉得复杂了
      

  2.   

    按照楼主说的方法试过啦,引用的dll没有引用别的dll,但是一直报错,加载不到对应的模块,这个是什么原因啊,求解
      

  3.   

    终于看到一点希望了,可问题是我已经把其他的dll放到java工程的目录下了,还是报错 无法加载,不知道怎么回事?楼主有其他见解吗?
      

  4.   

    @peak-power 可问题是我已经把其他的dll放到java工程的目录下了,还是报错 无法加载,不知道怎么回事?楼主有其他见解吗? 
    百度下jna引用C++吧,再不行把接口引用代码贴出来看看(如代码可以放开,不涉及机密)。
      

  5.   

    楼主你好,我想问下的是我用JNA 调用linux下的一个so文件,其又依赖于另一个的so库文件,那么我还需要对另一个库函数.h中的头文件进行map对应么?谢谢!
      

  6.   

    JNA对JNI进行了封装,用起来比JNI简单多了。
      

  7.   

    楼主,你好!我有两个问题想请教。
    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=5980JRE 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+0x16Failed to write core dump.Minidumps are not enabled by default on client versions of Windows求指导
      

  8.   


    这个有引用的关系需要放到一起的了,就把c++或者c语言的包(linux对应的.so或window对应的.dll文件)当中.jar包使用就可以了。看了你的报错,说的是VM运行环境异常。常见的VM运行环境异常有,64位的JDK装到了32位的window下或者64位的PC安装了32位的JDK.