我用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)请问这是什么原因啊?跟操作系统有关系?
怎么能解决,谢谢!

解决方案 »

  1.   

    找不到相关的动态链接库
    看你的这个dll调用了其他什么的dll
    应该是那台机器没有这样的dll
      

  2.   

    java.lang.UnsatisfiedLinkError:就是找不到dll的异常,把dll放到system32吧。
      

  3.   

    把你编译好的这个动态链接库放到java.larbray.path中就可以了,我的空间有这方面的论述
      

  4.   


    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虚拟机崩溃。
      

  5.   

    一定要放在java.library.path下,这个我做了很多的项目用到过,比如加密算法我也这么实现的,给你个具体的例子吧。
    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);
    }