4

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

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

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

在这个解决方案中,我在安装包中放入了 3 个不同名称的 libs 版本:(原名为 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");
    }
4

1 回答 1

2

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

因为/data/data/<appname>/lib不能修改目录,所以我把库复制到/data/data/<appname>/files目录下,并重命名。

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

于 2013-03-29T06:41:46.747 回答