Android JNI,如何使用soname libxx.so.1.2.3加载库
需要使用第三方提供的android共享库,该库的soname和文件名相同,格式为libxx.so.1.2.3,在linux上很常见。我将lib文件重命名为libxx.so,并使用ndk build在libmyjni.so中链接libxx.so。在我的java代码中,在调用libmyjni.so中的函数之前,我按如下方式加载它们: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");
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);
好的。我找到了解决类似问题的办法。如果有人不熟悉将资产中的文件复制到设备中的存储,那么您的解决方案描述就有点过于简洁,难以遵循,而且几乎会产生误导。