最近一个偶然的项目需要用到了java以使用java来调用vs 2005的动态库,先前只是在网上看到过了这方面的一些知识,总体上好像有三种方法,我没有各个方法都测试一下,在这里我主要讲的是JNative的使用方法,我们得感谢JNative的发布者,这个jar的发布让我们调用dll动态链接库方便了很多很多,而且相对来说都是很简单的。
这里先简单的说一下JNative的rar包,我是从网上搜多一下,最后是在csdn的网站里找到下载的rar包,我用的版本是JNative-1.3.2,压缩包里共有三个文件:JNative.jar、JNativeCpp.dll、libJNativeCpp.so,这三个文件其中有两个是分别在不同系统中用到的,相信我不用说也应该知道dll是在windows系统下,so是在linux系统下。而最主要的就是使用jar包了,这个包里面包含了很多函数,我使用的开发环境是NetbeansIDE集成开发环境,我将jar包导入库中通过打开可以看到jar包中包含了很多的的包,如下图所示:
以上就是JNative中的包,有兴趣的你可以一一点击开查看其中每个包中的类函数。
下面我要说的是如何去在windows系统下如何去配置环境,和如何使用dll。首先我们将解压的JNativeCpp.dll放到系统windows/System32文件夹下,然后让JNative.jar放到你的安装java JDK的jre/lib/ext下,使用Netbeans添加jar库,这样就可以使用JNative了,相信你应该看懂了吧,我 已经说的很具体了,如果看不懂那你就不适合使用java开发了。
接下来我们是要进行import 以上jar包中的类包,用到那几个就import哪几个,我这里主要用到了org.xvolks.jnative.JNative org.xvolks.callbacks org.xvolks.pointer.* org.xvolks.pointer.memory 后面是就是要load windows的dll动态库,使用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动态库的一点点经验,拿出来分享一下,一直以来都是写博客的,后来由于太懒惰了很多的技术文档资料都没写出来了,从这里开始我会逐步的整理技术文档,将自己的一些技术问题拿出来供大家分享和修改,并且在这里哈佛小丸子愿我们能够拿出更多的技术来分享。。。。