如何根据Android设备的CPU能力加载不同的JNI库?

4

我有几个jni动态库(*.so),与cpu能力相关,例如,一些库支持armv7 + neon cpu,一些库支持armv7 + vfpv3 cpu,一些库支持非armv7 cpu。

如何根据CPU能力动态加载它们?

我尝试了以下代码,但不起作用。

在这个解决方案中,我将3个版本的库放在安装包中,并使用以下不同的名称: (原始名称是libavcodec.so)

  1. libavcodec_neon.so和libavutil_neon.so
  2. libavcodec_vfpv3.so和libavutil_vfpv3.so
  3. libavcodec_basic.so和libavutil_basic.so

但是libavcodec.so依赖于libavutil.so,所以loadLibrary函数会失败,因为其名称已更改。

也许我可以在加载它们之前将库重命名为原始名称,怎么做呢?

   String cpu_ability = getCpuAbility();    

    if (cpu_ability.equals("cpuinfo_armv7_neon")) {
        System.loadLibrary("avutil_neon");
        System.loadLibrary("avcodec_neon");
    }
    else if (cpu_ability.equals("cpuinfo_armv7_vfpv3")) {
        System.loadLibrary("avutil_vfpv3");
        System.loadLibrary("avcodec_vfpv3");
    }
    else {
        System.loadLibrary("avutil_basic");
        System.loadLibrary("avcodec_basic");
    }
1个回答

2

我找到了一种解决这个问题的方法。

由于目录/data/data/<appname>/lib无法修改,所以我将库复制到/data/data/<appname>/files目录中,并将其重命名。

例如,在armv7+neon的情况下,我将libavcodec_neon.so复制到files目录中,并将其重命名为libavcodec.so。其他库也是如此。然后从files目录加载它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接