-
如果目标平台的 API Level 小于 21,只能使用 CPU_ABI 要 CPU_ABI2 来选择了,而 CPU_ABI 要优于 CPU_ABI2。
-
API Level >=21的推荐使用android.os.Build.SUPPORTED_ABIS,但是21以下只能使用CPU_ABI 和CPU_ABI2
测试下这几个变量的值
针对某一个固定的设备,如Nexus 9设备(arm64-v8a CPU架构)
根据前面说描述 设备的兼容情况
SUPPORTED_ABIS 比较容易理解,返回arm64-v8a,armeabi-v7a,armeabi
而CPU_ABI 和CPU-ABI2的值不是固定不变的,它会根据 APK 打包的jniLibs ,并根据设备支持的abi选择性安装,返回不同的值
所以5.0(21)以上,推荐使用android.os.Build.SUPPORTED_ABIS判断获取设备支持的架构类型,而5.0以下则使用android.os.Build.CPU_ABI 即可,android.os.Build.CPU_ABI2的价值也不是很大。
activity.getApplicationInfo().nativeLibraryDir 暂时未用到
4.4-> /data/app-lib/com.less.tplayer.baidu-15.0-> /mnt/asec/com.less.tplayer.baidu-2/lib/arm64
动态加载网络或文件夹下的so库
加载某文件夹 -> 相应架构的so文件
Apk文件本身就是一个压缩文件,解压后目录结构大致如下:
某apk文件的解压目录
动态加载so案例
我先把完整的代码贴出来,然后讲解可能遇到的两个错误。
动态加载的核心类(根据abi从本地选择合适的so库加载)
public class DynamicSO {
private static final String TAG = DynamicSO.class.getSimpleName();
public static void loadExSo(Context context,String soN