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();
}
}
}
- Windows 下java调用C++ dll动态链接库
- windows下动态链接库(dll)
- java调用动态链接库(dll)
- JNI java调用动态链接库dll
- JAVA调用动态链接库(dll)
- 使用Java调用dll动态链接库
- java调用动态链接库 dll
- linux下 java JNI调用C语言动态链接库
- linux下 java JNI调用C语言动态链接库
- linux下 java JNI调用C语言动态链接库
- Java框架JNA调用C方法(windows链接库dll文件、linux链接库so文件)
- java如何调用windows动态链接库
- Java使用JNI调用C/C++的DLL动态链接库1
- Java使用JNI调用C/C++的DLL动态链接库2
- Java调用C/C++编写的第三方dll动态链接库
- java调用c/c++编写的第三方dll动态链接库
- JNI技术之Java调用C/C++编写的第三方dll-动态链接库
- Java调用C/C++编写的第三方dll动态链接库
- Delphi传中文参数给Jsp
- 实现axis2两种不同方式的客户端
- CTreeCtrl(图片和状态图片、动态提示、选中节点颜色、查询)
- 带bar的横向图片循环轮播(可修改轮播速度)
- 七个受用一生的心理寓言
- Windows 下java调用C++ dll动态链接库
- pbmi = (BITMAPINFO*)(pbmfh + 1); 这行代码终于懂了
- 读取位图的类
- SecurityError: Error #2148: SWF 文件 (SWF 文件不能访问本地资源)
- 【转】临终病人最常后悔的五件事
- Head First 设计模式——策略模式(Strategy Pattern)——Python实现
- TIOBE发布了2011年6月份的编程语言排行榜
- 新闻发布系统阶段小结
- 内联函数断点超限解析