6

需要使用来自第三方的android共享库,该库的soname和文件名相同,格式为libxx.so.1.2.3,在linux上很常见。我将 lib 文件重命名为 libxx.so,并使用 ndk-build 在 libmyjni.so 中链接 libxx.so。在我的 java 代码中,在调用 libmyjni.so 中的函数之前,我像这样加载它们:

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

我必须手动将 libxx.so.1.2.3 复制到 /data/local/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

1 回答 1

7

这就是我最终所做的,保持 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);
于 2012-07-11T13:55:33.627 回答