[英]Not able to load rxtx native library with System.load
我目前在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
使用。
我想用可分發的jar捆綁jnilib
,這就是為什么我要以編程方式加載它。
有人有主意嗎?
如果您有這個:
root:
main.jar
libjni.jnilib
然后使用以下命令在根目錄中運行代碼:
java -jar main.jar
在這種情況下,您的加載代碼應類似於:
System.load("libjni.jnilib");
但是,對於bot System.loadLibrary(),加載比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
希望這可以幫到你。
確保將您的庫放在LD_LIBRARY_PATH上。
在這里查看為macOS / Linux編寫的許多與JNI相關的示例。
我建議從超級簡單的Hello world應用開始:
http://jnicookbook.owsiak.org/recipe-No-001/
您可以在那里查看如何使用JNI for macOS使用標准工具進行開發。
希望這可以幫助。 玩JNI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.