以前也见过dll可是不知道是什么东西,这几天在与另外一家公司合作的时候需要调用人家的.dll,研究了好几天才弄出来,与大家分享一下,希望有需要的人可以看到这篇文章,可以帮助大家以最快的速度完成工作。
我用的JNative实现的,我调用的dll是用C++写的:
第一步:先从网上下载 JNative-1.3.2.zip 解压以后里面有三个文件,分别是:JNative.jar,JNativeCpp.dll(windows),libJNativeCpp.so(linux);
其中JNativeCpp.dll 放在 C:/WINDOWS/system32下,并将要调用的.dll文件也放到该目录下
而libJNativeCpp.so是用在linux系统下的。
将JNative.jar放到项目WEB-INF/bin下;
第二步:调用方法如下:
要引入的包有:
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
调用方法:
以下是C++方法:
int Compress(
const byte* pbyteSource,
long lngSourceSize,
byte* pbyteDest,
long* plngDestSize);
以下是java调用:
/**
* 压缩接口
* */
public byte[] Compress(byte[] source)throws NativeException, IllegalAccessException{
JNative n= null;
//声明指针类型
Pointer pbyteSource = new Pointer(MemoryBlockFactory.createMemoryBlock(source.length));
pbyteSource.setMemory(source);
Pointer pbyteDest = null; //需要保存压缩后的数据指针
Pointer plngDestSize = new Pointer(MemoryBlockFactory.createMemoryBlock(4)); //实际压缩数据的长度,如果传入0,则返回需要保存压缩数据长度
plngDestSize.setIntAt(0, 0);
try{
/**start 计算需要压缩的数据的长度**/
n = new JNative("sehr.crypto.dll", "Compress");//第一个参数是要调用的.dll名称(包含扩展名),第二个参数是要调用dll里的函数名称。
n.setRetVal(Type.INT);//设置该方法要返回的数据类型
n.setParameter(0, pbyteSource);//需要压缩数据的指针地址 设置第一个参数
n.setParameter(1,Type.INT, String.valueOf(source.length));//需要压缩数据的字节长度 设置第二个参数,其中“Type.INT”为该参数的类型,String.valueOf(source.length)为该参数的值;
n.setParameter(2, pbyteDest);//需要保存压缩后的数据指针 设置第三个参数
n.setParameter(3, plngDestSize);//实际压缩数据的长度,如果传入0,则返回需要保存压缩数据长度 设置第四个参数
n.invoke();//执行该方法;
if(n.getRetValAsInt() != 0){//得到返回结果
System.out.println("压缩数据错误A");
}
/**end 计算需要压缩的数据的长度**/
/**start 对数据进行压缩操作**/
pbyteDest = new Pointer(MemoryBlockFactory.createMemoryBlock(plngDestSize.getAsInt(0)));//需要保存压缩后的数据指针
n.setParameter(2, pbyteDest);//需要保存压缩后的数据指针
n.invoke();
if(n.getRetValAsInt() != 0){
System.out.println("压缩数据错误B");
}
/**end 对数据进行压缩操作**/
byte[] obj = pbyteDest.getMemory();
int a = plngDestSize.getAsInt(0);
byte[] ret = new byte[a];
System.arraycopy(obj, 0, ret, 0, a);
return ret;//根据实际情况,也可以返回pbyteDest.getMemory();或者pbyteDest.getAsString();
}finally{
if(n != null){
n.dispose();
}
if(pbyteSource != null){
pbyteSource.dispose();
}
if(pbyteDest != null){
pbyteDest.dispose();
}
if(plngDestSize != null){
plngDestSize.dispose();
}
}
}