java 调 dll 动态连接库以及java回调函数在dll中的应用

时间:2022-03-25 20:17:18

最近一个偶然的项目需要用到了java以使用java来调用vs 2005的动态库,先前只是在网上看到过了这方面的一些知识,总体上好像有三种方法,我没有各个方法都测试一下,在这里我主要讲的是JNative的使用方法,我们得感谢JNative的发布者,这个jar的发布让我们调用dll动态链接库方便了很多很多,而且相对来说都是很简单的。

      这里先简单的说一下JNativerar包,我是从网上搜多一下,最后是在csdn的网站里找到下载的rar包,我用的版本是JNative-1.3.2,压缩包里共有三个文件:JNative.jarJNativeCpp.dlllibJNativeCpp.so,这三个文件其中有两个是分别在不同系统中用到的,相信我不用说也应该知道dll是在windows系统下,so是在linux系统下。而最主要的就是使用jar包了,这个包里面包含了很多函数,我使用的开发环境是NetbeansIDE集成开发环境,我将jar包导入库中通过打开可以看到jar包中包含了很多的的包,如下图所示:

 

java 调 dll 动态连接库以及java回调函数在dll中的应用

 

 

以上就是JNative中的包,有兴趣的你可以一一点击开查看其中每个包中的类函数。

 

下面我要说的是如何去在windows系统下如何去配置环境,和如何使用dll。首先我们将解压的JNativeCpp.dll放到系统windows/System32文件夹下,然后让JNative.jar放到你的安装java JDKjre/lib/ext下,使用Netbeans添加jar库,这样就可以使用JNative了,相信你应该看懂了吧,我 已经说的很具体了,如果看不懂那你就不适合使用java开发了。

 

     接下来我们是要进行import 以上jar包中的类包,用到那几个就import哪几个,我这里主要用到了org.xvolks.jnative.JNative  org.xvolks.callbacks org.xvolks.pointer.* org.xvolks.pointer.memory  后面是就是要load windowsdll动态库,使用System.Load(“你的动态库的路径”) 然后就是使用JNative n = new JNative("动态库的名字"函数名字”) n.setRetVal(Type.INT)   n.setparamater(0,Type.INT,"参数") 后面类推有几个参数写几个参数 最后使用 n. invoke(),这样就编译源程序,然后执行源程序就可以了。

     以上介绍的是一般常用到的java调用dll的用法,大家注意的题目还有关于dll中存在回调函数的问题,我相信大家应该知道java中是没有指针的,而恰恰在回调函数用到的就是函数的指针,这种与java中的无指针用法矛盾了,其实我们应该感谢JNative的作者,他已经想到了如何在JNative中使用java回调函数,要在dll中使用java的回调函数首先就要编写java回调函数java的回调函数是有固定的模板,其实也是在JNative包中。请看下面的代码

import java.util.ArrayList;  
import java.util.List;  
import org.xvolks.jnative.JNative;  
import org.xvolks.jnative.exceptions.NativeException;  
 
import org.xvolks.jnative.util.Callback;  
import java.util.ArrayList;  
import java.util.List;  
import org.xvolks.jnative.JNative;  
import org.xvolks.jnative.exceptions.NativeException;  
 
import org.xvolks.jnative.util.Callback;  
 
public abstract class javacallback implements Callback  {  
   //
定义long型的list,用来实现接收回调函数中参数的地址

    private final List<Long> dataPackage;  
      
    public javacallback() {  
       
        dataPackage = new ArrayList<Long>();  
    }     
  //java
回调函数其中long[] values就是回调函数中参数
    public int callback(long[] values) {  
        // TODO Auto-generated method stub  
          
        if (values == null) {  
            return 3;  
        }  
        //
参数个数为2
        if (values.length == 2) {  
            try {  
                if (values[0] > 0) {  
                    dataPackage.add(values[0]);  
                    System.out.println(values[1]);  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
      
            return 1;  
        } else {  
            return 2;  
        }  
    }  
   //
返回回调函数地址

    public int getCallbackAddress() throws NativeException {  
        // TODO Auto-generated method stub  
        return JNative.createCallback(2, this);  
    }   
}

以上就是java回调函数,其中你的回调函数内容的处理就是在函数public int callback(long[] values)中,这里我要将的是对接收到参数的处理和解析,如果回调函数是普通的数据类型,那么只要是使用JNative中函数从values地址中取值就可以了,下面我着重要说的就是如何使用pointer java指针来读取c中的类型指针,使用Pointer new一块内存空间,但是new的这个块内存空间要是在values地址下的。Pointer _pointer = new Pointer(new NativeMemoryBlock((int)values[0],100));以后要解析的指针内的内容就都在_pointer里了。这里你要仔细的去看Pointer包里的函数才能解析出你要的内容来。

 

 

 这就是我在这个项目中使用java来调用vs 2005动态库的一点点经验,拿出来分享一下,一直以来都是写博客的,后来由于太懒惰了很多的技术文档资料都没写出来了,从这里开始我会逐步的整理技术文档,将自己的一些技术问题拿出来供大家分享和修改,并且在这里哈佛小丸子愿我们能够拿出更多的技术来分享。。。。