2017-04-13 43 views
0

我目前正在開發的OS X和嘗試加載librxtxSerial.jnilibSystem.load(),這是行不通的,總是導致無法加載RXTX本地庫與System.load

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

當我將該庫放在/Library/Java/Extensions中一切正常。
我有雙重檢查路徑和一切,但它不會與System.load,當我從/Library/Java/Extensions刪除庫。

我想將jnilib與可分發的jar捆綁在一起,這就是爲什麼我想以編程方式加載它的原因。

有沒有人有想法?

回答

1

,如果你有這樣的:

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 

希望這可以幫助你。