Android JNI,如何使用soname libxx.so.1.2.3加载库

bre*_*one 6 linux java-native-interface android

需要从第三方使用一个共享的lib for android,lib的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");
Run Code Online (Sandbox Code Playgroud)

我必须手动将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")来加载它.

bre*_*one 6

最后我做了什么,保持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);
Run Code Online (Sandbox Code Playgroud)