我用vc6.0写了一个dll,在java里通过jni来调用这个dll,在我的机器上没有问题,在别人的机器上出错
java.lang.UnsatisfiedLinkError: c:\test.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)请问这是什么原因啊?跟操作系统有关系?
怎么能解决,谢谢!
java.lang.UnsatisfiedLinkError: c:\test.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)请问这是什么原因啊?跟操作系统有关系?
怎么能解决,谢谢!
看你的这个dll调用了其他什么的dll
应该是那台机器没有这样的dll
System.out.println(System.getProperties().get("java.library.path"));
输出看看,你的dll在不在下面的路径里。没有的话,就加进去,或者,调用时添加 -Djava.library.path= yourpath
貌似你的dll还有其它的依赖库,用Anywhere PE Viewer查看下Import Table里需要的dll。顺便给几条建议: 1. 如果可以通过TCP/IP实现Java代码与本地C/C++代码的交互工作,那么最好不使用以上提到的JNI的方式,因为一次JNI调用非常耗时,大概要花0.5~1个毫秒。 2. 在一个Applet应用中,不要使用JNI。因为在 applet 中可能引发安全异常。 3. 将所有本地方法都封装在单个类中,这个类调用单个 DLL。对于每种目标操作系统,都可以用特定于适当平台的版本替换这个 DLL。这样就可以将本地代码的影响减至最小,并有助于将以后所需的移植问题包含在内。 4. 本地方法要简单。尽量将生成的DLL 对任何第三方运行时 DLL 的依赖减到最小。使本地方法尽量独立,以将加载DLL 和应用程序所需的开销减到最小。如果必须要运行时 DLL,则应随应用程序一起提供它们。 5. 本地代码运行时,没有有效地防数组越界错误、错误指针引用带来的间接错误等。所以必须保证保证本地代码的稳定性,因为,丝毫的错误都可能导致Java虚拟机崩溃。
public class Hello{
static void copy() {
// 获取服务器所使用的操作系统Windows或者Linux
String osInfo = System.getProperty("os.name");
String path="";
String aPath="";
File javaencrypt = null;
String fileName = "";
if (osInfo.toLowerCase().indexOf("windows") != -1){
path = System.getProperty("java.library.path");
aPath = path.substring(0, path.indexOf(';'));
javaencrypt = new File(aPath + File.separator + "hello.dll");
fileName = "hello.dll";
}
else{
path = System.getProperty("java.library.path");
aPath = path.substring(0, path.indexOf(':'));
javaencrypt = new File(aPath + File.separator + "libhello.so");
fileName = "libhello.so";
}
copyOne(javaencrypt, fileName); }
//将dll或者so文件拷贝到java.library.path
static void copyOne(File dest, String src) {
InputStream inputStream = Hello.class
.getResourceAsStream(src);
FileOutputStream outputStream;
try {
outputStream = new FileOutputStream(dest); byte[] array = new byte[8192];
for (int i = inputStream.read(array); i != -1; i = inputStream
.read(array)) {
outputStream.write(array, 0, i);
}
outputStream.close();
inputStream.close();
} catch (Exception e) { } } static {
copy();
String osInfo = System.getProperty("os.name");
if (osInfo.toLowerCase().indexOf("windows") != -1){
System.loadLibrary("hello");
}
else{
System.loadLibrary("hello");
}
} public native String hello(String value);
}