2012-07-09 33 views
3

需要使用來自第三方的android共享庫,lib的soname和文件名相同,格式爲libxx.so.1.2.3,這在linux上很常見。我將lib文件重命名爲libxx.so,並使用ndk-build將libxx.so鏈接到libmyjni.so中。在我的Java代碼,調用libmyjni.so功能之前,我加載它們是這樣的:Android JNI,如何使用soname加載庫libxx.so.1.2.3

System.load("/data/local/tmp/libxx.so.1.2.3"); 
    System.loadLibrary("myjni"); 

我必須手動libxx.so.1.2.3複製到/數據/本地的/ tmp /。它以這種方式運行良好,在上面的加載之後,我可以調用libmyjni.so中的函數。

在代碼「System.loadLibrary(」myjni「);」中,系統總是試圖從某處獲取libxx.so.1.2.3。我想知道,在現實世界中,如何在安裝期間將libxx.so.1.2.3複製到android設備上的特定位置?這樣我就可以System.load()它了。

或者android有官方的方式將自制lib安裝到/ system/lib /?

如果libxx.so.1.2.3格式爲libxx.so,那麼我可以使用System.loadLibrary(「xx」)加載它。

回答

4

這是最後我做什麼,保持不變libxx.so.1.2.3做所有的東西在Java中:

認沽libxx.so.1.2.3 android系統中的資產。 在MainApp.OnCreate()中,將文件複製到私有文件夾並從那裏加載:

AssetManager am = applicationContext.getAssets(); 
    in = am.open(OPENSSL_SO_LIB_NAME); // source instream 

    File privateStorageDir = applicationContext.getFilesDir(); 
    String libPath = privateStorageDir.getAbsolutePath(); // copy the lib to here ... 

    System.load(libPath + "/" + SO_LIB_NAME); 
+0

好的。我找到解決我類似問題的方法。如果有人不熟悉將資產中的文件複製到設備中的存儲中,只是您的解決方案描述有點過於簡潔,並且幾乎誤導人。 – user1914692 2013-05-22 22:50:19