从Jython模块使用JNI调用本机代码时出错

时间:2015-05-29 01:07:49

标签: eclipse java-native-interface jython

我正在调用一个用Jython模块(在PyDev项目中)用C编写的简单HelloWorld程序。有一个中间Java类(在一个单独的Java项目中),它使用JNI(Java Native Interface)调用本机代码。如果直接运行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代码时才会出现问题。

1 个答案:

答案 0 :(得分:1)

尝试System.load([full path and filename of ctest]),其独立于LD_LIBRARY_PATHjava.library.path的值。

为了简化用户配置,我通常会实现自己的库搜索机制,即让它在工作目录和类路径中查找库。我在意识形态上知道这有点不对,但对你的用户来说更顺畅。使用java.io.File.exists确认ctest文件的实际位置,然后使用java.io.File.getAbsolutePath()获取System.load的相应输入。 System.mapLibraryName(...)对此也很有用。