这几天同事调用.dll文件出现各种问题, 在下闲来无事,也来玩玩,碰到的问题做个记录,指不定哪天就能用上,休洛洛洛~
java调用.dll组件几种方式(JNI&JNATIVE&JNA)
JNI
- JNI不要额外导入jar包,内置引用就可;
- 需要注意几点也是JNI调用的短板吧:
- 编写c++ .dll中 需要引入java生成的.h文件 **重点要考圈起来
类似于规定了一种特定语法,需要编辑C端代码
- 编写c++ .dll中 需要引入java生成的.h文件 **重点要考圈起来
- https://www.cnblogs.com/xiaocainiao2hao/p/5619862.html
JNATIVE
- 环境配置
- 代码调用
- 测试
JNA
.dll文件生成
JNI
JNATIVE
1.下载JNATIVE jar包 根据系统选择.dll/.so 文件,将其中的JNativeCpp.dll拷贝到system32文件夹中,libJNativeCpp.so是linux平台使用的(以下只描述.dll .os同理)
2.将jnative jar和 包导入现有工程,或copy至jdk/jre/lib/ext下
3.编写测试代码
package main.com.java;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
/**
* @Auther: jyb
* @Date: 2018/8/31 14:31
* @Description:
*/
public class JnativeTestDll {
public static void main(String[] args) {
//加载.dll文件
// System.loadLibrary("hellodll");
JNative getUrl;
try {
//调用dll库,第一个参数为dll名字 第二个参数为dll库中函数的名字
// getUrl = new JNative("DolphinM2RobotNetCtrl", "_NET_ROBOT_PTZLightControl@4");
getUrl = new JNative("hellodll", "?Add@MyMathFuncs@MathFuncs@@QAENNN@Z");
double f1 = 2.3;
double f2 = 3.7;
//定义函数返回值类型
getUrl.setRetVal(Type.DOUBLE);
getUrl.setParameter(0, Type.DOUBLE, "2.3");
getUrl.setParameter(1, Type.DOUBLE, "3.7");
//执行所调用的函数
getUrl.invoke();
//获取所调用的函数的返回值
System.out.print( getUrl.getRetVal());
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. 运行测试
问题总结:
org.xvolks.jnative.exceptions.NativeException: Function xxx not found
调用的.dll函数名称是经过编译后的优化名称,这也是与JNI调用的函数名称不同之处,
如果遇以上错误则需要考虑该问题,可使用eXeScope工具打开.dll文件查看导出的函数名称是否与调用的一致;java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library
.dll访问环境有问题, 检查.dll是否放入系统环境变量中 ,如jdk/bin目录下java.lang.UnsatisfiedLinkError: TestDll.NET_ROBOT_PTZLightControl(Ljava/lang/Short;)I
请求方法名称不对应不是32位应用程序
1.检查.dll是32还是64位
2.jdk版本为32/64位
3.保持 jdk版本与.dll版本一致