Windows 下java调用C++ dll动态链接库

来源:互联网 发布:禾米网络支付 编辑:程序博客网 时间:2024/06/04 19:58

以前也见过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();
   }
  }
 }

原创粉丝点击