android - 如何在Android系统应用程序中升级 native 库

标签 android android-ndk

我为我的 ROM 开发了一个系统应用程序,其中包括一些 native 库。 我已经尝试过以下方法:

  1. 不要将此 native 库复制到/system/lib 中,而是将其放入 apk 中。在这种情况下,库将不会在系统启动时复制到/data/data/xxxx/lib ,并且由于找不到库,我的应用程序将无法运行。 ( PackageManagerService.java 3301 注意:我们不想解压系统应用程序的 native 二进制文件,除非它们已更新(二进制文件已经位于/system/lib 下)。换句话说,我们将仅为非系统应用程序和系统应用程序升级解压二进制文件。 )

  2. 将此库复制到/system/lib。我的应用程序首先运行正常,但是当我升级它时,新版本的库将在启动时复制到/data/data/xxxx/lib 。但由于 android 会在/data/data/xxx/lib 之前先在/system/lib 中查找库(在 DexClassLoader::findLibrary 中),所以旧版本的库将始终被加载。这意味着我将无法升级原生库。

那么,我该怎么办?谢谢

最佳答案

System.loadLibrary()相比,您可以使用System.load()(它使用完整路径参数)来实现不同的库搜索机制。下面是一个简单的例子:

public void loadLibrary(Context context, String libName) {
    String packageName = context.getPackageName();
    String libPath = "/data/data/" + packageName + "/lib/" + libName;
    if (new File(libPath).exists()) {
        System.load(libPath);
    } else {
        System.loadLibrary(libName);
    }
}

关于android - 如何在Android系统应用程序中升级 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11044507/

相关文章:

android-ndk - Android : error: cannot open crtbegin_dynamic. o: 没有那个文件或目录

android - FFMPEG x264 编码器 Android

android - ScrollView 不显示某些 UI 元素

java - 在 Android 中追踪 java.lang.ArrayIndexOutOfBoundsException

当我尝试复制一个字符串时,Android NDK strcpy 崩溃

android - 如何在 Eclipse 中为 Android 开发配置 Tesseract?

android - 实现baresip NDK库导致缺少*.so文件

当我在 Activity 之间传递 Intent 时,Android 应用程序崩溃

Android:ListView OnItemClick 显示 Toast

java - 安卓 ClassNotFoundException : Didn't find class on path