Android JNI,如何加载带有soname libxx.so.1.2.3的库。

7

需要在Android中使用第三方共享库,该库的soname和文件名相同,格式为libxx.so.1.2.3,这在Linux上很常见。我将库文件重命名为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有官方方法将自制库安装到/system/lib/吗?
如果libxx.so.1.2.3格式为libxx.so,则我可以使用System.loadLibrary(“xx”)来加载它。
1个回答

8

最终我所做的是,保持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);

不错。我找到了解决类似问题的方法。只是你的解决方案描述有点过于简洁,如果有人不熟悉将文件从资源复制到设备存储中,几乎会产生误导。 - user1914692

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接