【发布时间】:2015-05-29 01:07:48
【问题描述】:
我正在从 Jython 模块(在 PyDev 项目中)调用一个用 C 语言编写的简单 HelloWorld 程序。有一个中间 Java 类(在一个单独的 Java 项目中),它使用 JNI(Java 本机接口)调用本机代码。如果我直接运行 Java 类,则本机调用成功。但是当我从我的 Jython 模块调用 Java 类时,我收到以下错误:
java.lang.UnsatisfiedLinkError: no ctest in java.library.path
我已经使用 JNA(Java Native Access)从我的 Jython 模块中成功运行了几个 C 程序。但是 JNA 对性能(速度)的影响非常大,我想重新审视 JNI 并解决这个问题(我也只是想知道发生了什么)。我使用的 IDE 是 Eclipse。
Java 类的代码如下:
package JNIPackage;
public class HelloWorld {
native void helloFromC(); /* (1) */
static {
// Added the line below but still no luck. Was sure this would fix it.
System.setProperty("java.library.path", "/Users/haiderriaz/Desktop/JNI-C");
System.loadLibrary("ctest"); /* (2) */
}
static public void main(String argv[]) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.helloFromC(); /* (3) */
}
}
直接运行这个Java类,没有错误,打印出“Hello World”。但是当我将JNIPackage 导入到我的Jython 模块然后调用JNIPackage.HelloWorld 时,突然java 找不到ctest。我认为这很奇怪,并且仅在使用 JNI 而不是 JNA 调用 C 代码时才存在问题。
【问题讨论】:
-
JNA 使用
jna.library.path查找您的ctest库。System.loadLibrary()取决于能否在java.library.path中找到本机库,该库派生自%PATH%(在 windows 上)或LD_LIBRARY_PATH(在 linux 上)。 -
我试过
System.setProperty("java.library.path", "The Path");我确信这可以工作,但它仍然无法找到图书馆。 -
手动设置
java.library.path不会影响启动VM时生效的系统路径。系统库加载路径很大程度上决定了System.loadLibrary()是否能够找到给定的共享库。 -
所以,我在 mac 中使用 Eclipse。如何让
System.loadLibrary()搜索正确的路径? -
在你的JVM环境中设置
DYLD_LIBRARY_PATH。
标签: eclipse java-native-interface jython