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

Android JNI,如何使用soname libxx.so.1.2.3加载库,android,linux,java-native-interface,Android,Linux,Java Native Interface,需要使用第三方提供的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");

需要使用第三方提供的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”)来加载它

这里是我最后做的,保持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);

好的。我找到了解决类似问题的办法。如果有人不熟悉将资产中的文件复制到设备中的存储,那么您的解决方案描述就有点过于简洁,难以遵循,而且几乎会产生误导。