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

时间:2012-07-09 03:41:42

标签: android linux java-native-interface

需要从第三方使用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");

我必须手动将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”)加载它。

1 个答案:

答案 0 :(得分: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);