我目前正在使用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捆绑在一起,这就是我想以编程方式加载它的原因。
有人有想法吗?
答案 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相关示例。
我建议从晚餐简单的Hello world应用开始:
http://jnicookbook.owsiak.org/recipe-No-001/
您可以使用标准工具了解如何使用JNI for macOS进行开发。
希望这会有所帮助。和JNI一起玩。