无法使用System.load

时间:2017-04-13 05:21:23

标签: java java-native-interface rxtx

我目前正在使用OS X进行开发并尝试使用librxtxSerial.jnilib加载System.load(),这只是不起作用而且始终会导致

java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver

当我将lib放在/Library/Java/Extensions时,一切正常 我有双重检查路径和所有内容,但当我从System.load删除lib时,它只是不能使用/Library/Java/Extensions

我想将jnilib与可分发的jar捆绑在一起,这就是我想以编程方式加载它的原因。

有人有想法吗?

2 个答案:

答案 0 :(得分:1)

如果你有这个:

root:
  main.jar
  libjni.jnilib

然后使用以下命令在根目录下运行代码:

java -jar main.jar

在这种情况下,您的加载代码应该是:

System.load("libjni.jnilib");

但是bot System.loadLibrary(),load比loadLibrary更安全。

建议将jni库的绝对路径传递给System.load。

我在我的项目中使用过这样的东西:

/**
 * To load the JNI library
 * Created by ice1000 on 2017/1/6.
 *
 * @author ice1000
 */
@SuppressWarnings("WeakerAccess")
public final class Loader {
    public final static String JNI_LIB_NAME;
    private static boolean loaded = false;

    /*
     * maybe it's already loaded, so there should be a check
     */
    static {
        JNI_LIB_NAME = "libjni";
        loadJni();
    }

    @NotNull
    @Contract(pure = true)
    private static String libraryName(@NonNls @NotNull String libName) {
        String ___ = System.getProperty("os.name");
        String fileName;
        if (___.contains("Linux"))
            fileName = libName + ".so";
        else if (___.contains("Windows"))
            fileName = libName + ".dll";
        else // if (___.get("OSX"))
            fileName = libName + ".dylib";
//      else fileName = libName;
        return new File(fileName).getAbsolutePath();
    }

    public static void loadJni() {
        if (!loaded) {
            System.load(libraryName(JNI_LIB_NAME));
            loaded = true;
        }
    }
}

这是我的工作目录:

root:
  javaClasses.jar
  libjni.dll
  libjni.so
  libjni.dylib

希望这可以帮到你。

答案 1 :(得分:0)

确保将您的库放在LD_LIBRARY_PATH。

在这里查看为macOS / Linux编写的大量JNI相关示例。

http://jnicookbook.owsiak.org

我建议从晚餐简单的Hello world应用开始:

http://jnicookbook.owsiak.org/recipe-No-001/

您可以使用标准工具了解如何使用JNI for macOS进行开发。

希望这会有所帮助。和JNI一起玩。