【问题标题】:Error when calling Native Code using JNI from a Jython module使用 Jython 模块中的 JNI 调用本机代码时出错
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2021-03-10
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多