小弟使用JNI调用DLL时,如果把TestDll.class,TestDll.h及测试DLL(SampleDll.dll)都放在C:\j2sdk1.4.0-rc\bin下调用成功,如果放在工程中,总是出错,出错信息如下: at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1403)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:832)
at TestDll.<clinit>(TestDll.java:16)有时候还弹出Java virtual Machine launcher对话框:
    Could not find the main class.Program will exit!
我打印了一下取java.library.path 值的\语句,
      System.out.println("java.library.path :"+System.getProperty("java.library.path"));
值为:lib/native,不知道这是什么意思.请大侠指点,为什么在CMD下调试通过,在工程中就不可以.我已经把DLL放到C:\j2sdk1.4.0-rc\bin了.
小弟开发环境:j2sdk1.4.0-rc+JB8

解决方案 »

  1.   

    为什么在CMD下值却为:java.library.path :D:\JBuilder8\jdk1.4\bin;.;C:\WINNT\system32;C:\WINNT;C:\NMS\b
    in;C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\Program Files\Microsoft
    SQL Server\80\Tools\BINN;C:\Program Files\Symantec\pcAnywhere\;"C:\Program Files
    \Symantec\Norton Ghost 2003\";D:\Microsoft Visual Studio\Common\Tools\WinNT;D:\M
    icrosoft Visual Studio\Common\MSDev98\Bin;D:\Microsoft Visual Studio\Common\Tool
    s;D:\Microsoft Visual Studio\VC98\bin;C:\Program Files\IDM Computer Solutions\Ul
    traEdit-32;C:\BITWARE\
      

  2.   

    JB 在运行一个 Java 程序的时候,为其配备的环境变量跟在 CMD 下是不一样的。从你的测试情况看,在 JB 里运行 TestDll.class 的时候,C:\j2sdk1.4.0-rc\bin 根本就不在 PATH 环境变量中(也就是 java.library.path),所以,把 SampleDll.dll 放在 C:\j2sdk1.4.0-rc\bin 下是不管用的。两个办法都可以解决问题:1. 把 SampleDll.dll 放到 java.library.path 所指示的位置去;2. 在 JB 里做配置,使得 java.library.path 包含你放置 SampleDll.dll 的文件夹。
      

  3.   

    楼上正解
    我建议还是将Jb的JDK Path 改为C:\j2sdk1.4.0-rc\bin
    其他的lib路径也重新配置相应的目录
      

  4.   

    JB 在运行一个 Java 程序的时候,为其配备的环境变量跟在 CMD 下是不一样的。从你的测试情况看,在 JB 里运行 TestDll.class 的时候,C:\j2sdk1.4.0-rc\bin 根本就不在 PATH 环境变量中(也就是 java.library.path),所以,把 SampleDll.dll 放在 C:\j2sdk1.4.0-rc\bin 下是不管用的。两个办法都可以解决问题:1. 把 SampleDll.dll 放到 java.library.path 所指示的位置去;2. 在 JB 里做配置,使得 java.library.path 包含你放置 SampleDll.dll 的文件夹。
      

  5.   

    谢谢两位大侠!
    我在JB中配置JDK路径为C:\j2sdk1.4.0-rc(配置方法:Tools->Configure JDKs->JDK home path),还是不行呀
    另外,如何配置 java.library.path ?
    在JB中显示目录为:lib/native,这个路径到底是哪里??
      

  6.   

    配置 java.library.path是否是这样?
    Tools->Configure Libraries->Add一个目录,因为DLL不是JAR,无法直接包括进去,只能指到SampleDll.DLL的父目录?
      

  7.   

    或者放到jre/bin目录下看看
    如果不行
    要不就这样吧
    public class A
    {
         static
          {
               System.loadLibray("SampleDll.dll");
           }
         public A()
         {
          }
    }
      

  8.   

    在你的程序里加上下面这几行,然后在 JB 里运行它,就知道 lib/native 在哪儿了:    File f = new File("lib/native");
        System.out.println(f.getCanonicalPath());
      

  9.   

    谢谢maquan,我终于又向前进一步了,原来在lib/native是当前工程的lib目录.又碰到个问题,如果TestClass.java不是在工程根目录下,而是在com目录下(package com),则有两个问题:
    1.如何编译javah TestClass?
      若在工程根目录下,很简单,只要拷贝到C:\j2sdk1.4.0-rc\bin下,调用javah TestClass即可.
      现在不在根目录,如何编译?
    2.如何配置lib?
      如何放SampleDll.dll?
      

  10.   

    注:如果不是在当前工程的根目录下,则javah需要加路径,如:
      例:TestDll 的Package为:com
    首先在C:\j2sdk1.4.0-rc\bin>下新建目录:com
    并拷贝TestDll.class到C:\j2sdk1.4.0-rc\bin\com
    其次在CMD下,执行
    C:\j2sdk1.4.0-rc\bin>javah com.TestDll,
    在C:\j2sdk1.4.0-rc\bin下生成com_TestDll.h(结构为package_classname)
    最后com_TestDll.h加入到DLL中去,生成新的DLL
    注:如何把DLL加到工程路径中,防止出现java.library.path找不到DLL?
    首先在工程中获取java.library.path的路径.如果是JB,则在lib\native下(如果没有native,则新建native).
    最后把所有DLL放到lib\native下.
      

  11.   

    最后com_TestDll.h加入到DLL中去,生成新的DLLcom_TestDll.h 是如何加到DLL中去的?这时候DLL文件放在哪里?生成的位置又在哪里呢?