你所不知道的java调用dll
来源:互联网 发布:课文阅读软件 编辑:程序博客网 时间:2024/04/29 16:05
前段时间,帮客户做了点东西,用java调用dll,最近要写博客呢,就整理一下,给现在将要用和以后用的朋友们提供点方便,少走一些弯路。
总的来说,java调用dll还是比较顺利的,现在先说一下什么是dll吧,dll是Dynamic Link Library 的缩写形式,中文是动态链接库,是一个包含多个程序同时使用的代码和数据的库,dll不是可执行文件,不过可以被调用。
网上有多种调用方法有JNA调用的,有JNI调用的,还有JNative调用的,经过比较,我选择了JNative,JNI的方法是我调用so的时候,以后会介绍的。
首先要下载JNative组件,jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2,1.4的我也试过,也没有什么区别,可能会有区别吧,只是我调用的时候没有涉及到。 然后就是解压了,获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar。JNativeCpp.dll Windows下用的,拷贝到windows / system32目录下;libJNativeCpp.so Linux下的,拷贝到系统目录下;JNative.jar 这是一个扩展包,导入工程LIB中或将其拷贝到jdk\jre\lib\ext下,系统会自动加载。如果你是用eclipse调用的话,直接放到src目录下就可以了。
测试用的dll我是用delphi写的一个名为MyJavaDll的dll,dll中包含一个Triple函数,返回一个整形的结果,调用方法我是参考网上的资料,自己编写的,可能会和网上的一些有些类似。
首先配置好JNative组件的windows环境:
将Native要用到JNativeCpp.dll放在系统盘的\WINDOWS\system32下
将JNative.jar导入工程中,新建一个调用类:
java 代码
package com.test;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
publicclass AppSvrTestConnect {
public AppSvrTestConnect() {
}
/**
*测试调用结果
*
*@returnint6:成功0:失败
*@throwsNativeException
*@throwsIllegalAccessException
*/
privatestaticfinalint TestConnect(int num)throws NativeException, IllegalAccessException {
JNative n = null;
try {
n = new JNative("MyJavaDll.dll","Triple");
n.setRetVal(Type.INT);
int i = 0;
n.setParameter(i++, Type.INT,"" + num);
System.out.println("调用的DLL文件名为:"+n.getDLLName());
System.out.println("调用的方法名为:"+n.getFunctionName());
n.invoke();
return Integer.parseInt(n.getRetVal());
} finally {
if (n !=null)
n.dispose();
}
}
/**
*Dll文件放在WINDOWS\system32目录下面,ClassLoader就能通过System.loadLibrary()动态加载本地链接库
*TestConnectFromDllPath
*@throwsNativeException
*@throwsIllegalAccessException
*/
publicstaticfinalint TestConnectFromDllPath() throws NativeException, IllegalAccessException{
System.loadLibrary("MyJavaDll");
returnTestConnect(3);
}
}
这个类实现了一个静态私有方法,用来调用Dll文件中的方法返回结果
private static final int TestConnect(int num)
一个静态公共方法,装载DLL文件
public static final int TestConnectFromDllPath() //通过ClassLoader
然后新建一个类,调用AppSvrTestConnect.java,实现方法调用,我是将MyJavaDll.dll文件放在了WINDOWS\system32目录下,在JVM的Classloader的时候会自动加载,然后通过System.loadLibrary("MyJavaDll ")就可以装配DLL文件.
java 代码
publicclass Demo {
/**
*@paramargs
*@throwsIllegalAccessException
*@throwsNativeException
*/
publicstaticvoid main(String[] args)throws NativeException, IllegalAccessException {
Demo demo=new Demo();
demo.getInfo();
}
publicint getInfo()throws NativeException, IllegalAccessException{
// Dll文件已经放在WINDOWS\system32目录下面
int info = AppSvrTestConnect.TestConnectFromDllPath();
//结果6为成功
if (info == 6)
System.out.println("调用成功");
else
System.out.println("调用失败");
return info;
}
}
System.loadLibrary():装载Windows\System32下或jre\bin或Tomcat\bin目录下的本地链接库
• 备注
上面的示例工程,因为是例子,所以没有大多的设计,只是实现了装载DLL文件,调用DLL文件方法,返回信息.
JNative的详细说明,请参考JNative的源程序和例子.
注意JVM只允许一个默认的ClassLoader来load native library,同时并不提供专门的API来unload一个loaded native library,所以在项目调试的时候,独立启动Web Server.
到此java调用dll已经结束,感觉调用挺简单的,毕竟是window环境,如果调用so就需要考虑的多了,以后我会介绍的。
- 你所不知道的java调用dll
- java你所不知道的实用技巧
- java你所不知道的实用技巧
- 你所不知道的Java序列化
- 关于JAVA你所不知道的10件事
- Java之关于你所不知道的String
- 你所不知道的JAVA浮点数运算
- java中你所不知道的'=='
- 你所不知道list的妙用
- 你所不知道的西安
- 你所不知道的知识
- 你所不知道的华为(z)
- 你所不知道的const
- 告诉你所不知道的typedef
- 告诉你所不知道的typedef
- 你所不知道的台湾宗教
- 你所不知道的8020法则
- 你所不知道的传输层
- Unity3d 实现鼠标左键点击地形使角色移动到指定地点[脚本]
- linux下make使用
- Unity3D Shader官方教程翻译(一)
- xcode中出现 Valid Signing Identity not found
- 用Java使内存中的Session释放相关
- 你所不知道的java调用dll
- linux-0.11调试教程,findipn根据i节点号返回路径和文件名
- HUD 2026 首字母变大写
- 1006. 开门人关门人_时间排序
- 拒绝服务攻击(DoS, Denial of Service)
- URL中对特殊字符的处理
- 同步通信与异步通信的区别
- Unity3D Shader官方教程翻译(二)
- Android读写XML(下)——创建XML文档