我有几个jni动态库(* .so),它们与cpu能力有关,例如,一些libs支持armv7 + neon cpu,一些libs支持armv7 + vfpv3 cpu,一些libs支持非armv7 cpu。
如何根据CPU能力动态加载它们?
我尝试了以下代码,但无法正常工作。
在这个解决方案中,我将3个libs版本放在安装包中,其名称如下: (原名是libavcodec.so)
但libavcodec.so依赖于libavutil.so,因此loadLibrary函数将失败,因为它的名称已被更改。
也许我可以在加载之前将lib重命名为原始名称,怎么做?
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");
}
答案 0 :(得分:2)
我找到了解决这个问题的方法。
由于无法修改目录/data/data/<appname>/lib
,我将库复制到/data/data/<appname>/files
目录,并重命名。
例如,在armv7 + neon情况下,我将libavcodec_neon.so复制到files
目录,并将其重命名为libavcodec.so。其他lib也是如此。然后从files
目录加载它们。