我正在开发一个开源模拟器项目,它有多个可定制的 native 插件。这些插件被构建为 native 共享对象库(.so 文件),并通过 JNI 在 native 和 Java 之间具有各种接口(interface)。我不需要将 APK 与创建的每个插件一起分发,并且为了允许人们构建自己的自定义插件,我需要一种在安装应用程序后随时导入这些 .so 文件的方法。
我发现我可以将文件复制到文件夹/data/data/[package_name],但不能复制到 lib/子文件夹(因为它属于“system”组)。要在 Java 中使用 JNI 接口(interface),我必须调用 System.loadLibrary( libname );但是,这似乎要求 .so 文件位于 lib/子文件夹中。我能想到的唯一解决方法是要求用户拥有 root 设备。还有其他方法可以实现这一点吗?
最佳答案
使用 System.load() 代替:
static
{
final String[] libs = {
"/data/data/com.foo.test/lib/liba.so",
"/data/data/com.foo.test/lib/libb.so"
};
for (int i=0; i<libs.length; ++i)
{
Log.d(TAG, "Loading " + libs[i] + "...");
System.load(libs[i]);
}
}
$ adb logcat
D/LibTest(1022):正在加载/data/data/com.foo.test/lib/liba.so...
D/dalvikvm(1022): 尝试加载 lib/data/data/com.foo.test/lib/liba.so 0x40512640
D/dalvikvm(1022): 添加共享库/data/data/com.foo.test/lib/liba.so 0x40512640
D/dalvikvm(1022):在/data/data/com.foo.test/lib/liba.so 0x40512640中找不到JNI_OnLoad,跳过init
D/LibTest(1022):正在加载/data/data/com.foo.test/lib/libb.so...
D/dalvikvm(1022): 尝试加载 lib/data/data/com.foo.test/lib/libb.so 0x40512640
D/dalvikvm(1022): 添加了共享库/data/data/com.foo.test/lib/libb.so 0x40512640
D/dalvikvm(1022):在/data/data/com.foo.test/lib/libb.so 0x40512640中找不到JNI_OnLoad,跳过init
关于android - 如何在 Android 运行时导入共享对象库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324956/