android - 如何在 Android 运行时导入共享对象库?

标签 android android-ndk java-native-interface shared-libraries

我正在开发一个开源模拟器项目,它有多个可定制的 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/

相关文章:

android - Android 应用程序中的低功耗蓝牙

android - 应用程序类测试 M 备份时出现 ClassCastException 崩溃

android - 跟踪用户观看视频 android exoplayer 的时长

c++ - 谁能解释一下 Android 中 C 运行时的哪些功能(通过 NDK)不受支持?

无法解析 Android CDT setup std

java - 我可以将 java 窗口句柄传递给 OpenGL-es

android - 在 webrtc 中使用 MediaDevices.getUserMedia() 切换摄像头

linux - 无法进入 GDB 经过 Thumb/ARM 转换,未设置 ARM 断点

java - 在 Java 中使用 C++ API

java - 如何在 Java 代码中使用 OpenMP?