站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题JNI调用问题!!!无法调用DLL!!!立即结帐

JNI调用问题!!!无法调用DLL!!!立即结帐

摘要: JNI调用问题!!!无法调用DLL!!!立即结帐


小弟使用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.-#60;clinit-#62;(TestDll.java:16)

有时候还弹出Java virtual Machine launcher对话框:
Could not find the main class.Program will exit!


我打印了一下取java.library.path 值的/语句,
System.out.println(-#34;java.library.path :-#34;+System.getProperty(-#34;java.library.path-#34;));
值为:lib/native,不知道这是什么意思.

请大侠指点,为什么在CMD下调试通过,在工程中就不可以.我已经把DLL放到C:/j2sdk1.4.0-rc/bin了.
小弟开发环境:j2sdk1.4.0-rc+JB8




为什么在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/;-#34;C:/Program Files
/Symantec/Norton Ghost 2003/-#34;;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/


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 的文件夹。


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


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 的文件夹。



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



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


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



To octer,还是不行呀


在你的程序里加上下面这几行,然后在 JB 里运行它,就知道 lib/native 在哪儿了:

File f = new File(-#34;lib/native-#34;);
System.out.println(f.getCanonicalPath());


谢谢maquan,我终于又向前进一步了,原来在lib/native是当前工程的lib目录.

又碰到个问题,如果TestClass.java不是在工程根目录下,而是在com目录下(package com),则有两个问题:
1.如何编译javah TestClass?
若在工程根目录下,很简单,只要拷贝到C:/j2sdk1.4.0-rc/bin下,调用javah TestClass即可.
现在不在根目录,如何编译?


2.如何配置lib?
如何放SampleDll.dll?


注:如果不是在当前工程的根目录下,则javah需要加路径,如:
例:TestDll 的Package为:com
首先在C:/j2sdk1.4.0-rc/bin-#62;下新建目录:com
并拷贝TestDll.class到C:/j2sdk1.4.0-rc/bin/com
其次在CMD下,执行
C:/j2sdk1.4.0-rc/bin-#62;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下.


多谢,问题已经解决


↑返回目录
前一篇: 100分求解决方案:用POI的HSSF读取excel的问题:数据条数(5000)多的时候,会产生outofmemory错误~
后一篇: java调用c++函数的问题,请高手帮忙看看