JNI为调用DLL提供了接口,网上文章很多,一般调用的结构为:
package callDll.test;
public class Cdll {
static {
System.loadLibrary("javaCall");
}
public native String fstring(String s);
}
但使用时会出现UnsatisfiedLinkError
这种错误一般是加载用JNI加载DLL时出的问题,有两类问题:
1.
错误信息:UnsatisfiedLinkError: NO XXXXX in java.liberary.path
原因: 显然是找不到指定的DLL或者包,那就去找吧
解决方法:首先可以通过用System.load(“全路径”);加载,看能不能成功,如果成功,那说明你的系统环境没配好。若是不成功,则说明该DLL或包是缺少的,仔细查找都应该能找到。
2. 错误信息:UnsatisfiedLinkError:fstring;
原因:这是说明该方法与声明不符合。
解决方法:这个问题是我将两个Java工程合并时发现的问题,合并之后调用怎么都不好用。后来发现合并后Cdll所在的包 对调用有很多影响,这跟在delphi中开发给java调用的dll在导出方法时的命名规则相关。 以上述为例:在delphi中其方法名为 Java_test_Cdll_fstring, 该命名规则为Java_<包路径,其中的"."以"_"代替>_类名_方法名。 所以在合并工程后有两种方法:一是修改一下包结构;二是修改delphi中dll的方法名,改为 Java_callDll_test_Cdll_fstring 即可