Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用System.load加载rxtx本机库_Java_Java Native Interface_Rxtx - Fatal编程技术网

Java 无法使用System.load加载rxtx本机库

Java 无法使用System.load加载rxtx本机库,java,java-native-interface,rxtx,Java,Java Native Interface,Rxtx,我目前正在OS X上开发,并试图用System.load加载librxtxSerial.jnilib,但这不起作用,而且总是导致 java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver 当我将lib放在/Library/Java/Extensions中时,一切正常。 我已经仔细检查了路径和所有内容,但是当我从/Library/Jav

我目前正在OS X上开发,并试图用System.load加载librxtxSerial.jnilib,但这不起作用,而且总是导致

java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
当我将lib放在/Library/Java/Extensions中时,一切正常。 我已经仔细检查了路径和所有内容,但是当我从/Library/Java/Extensions中删除lib时,它就不能与System.load一起工作

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


有人有想法吗?

确保将您的库放在LD\u library\u路径上

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

我建议从简单的Hello world应用程序开始:

您可以在那里了解如何使用标准工具为macOS开发JNI

希望这有帮助。享受JNI带来的乐趣。

如果您有:

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
希望这能帮助你