在使用NDK编译过程中发现针对不同的CPU架构,部分支持编译调试,部分不支持调试,故记录下来,以防忘记
在Application.mk文件中有个预定义命令参数APP_ABI,是指明编译与调试的CPU架构。
目前Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x86(从2011年),MIPS(从2012年),ARMv8,MIPS64和x86_64(从2014年),每一种都对应相应的ABI。
CPU架构 | ABI | |
---|---|---|
ARMv5 | armeabi | 32位,从2010年 |
ARMv7 | armeabi-v7a | 32位,从2010年 |
x86 | x86 | 32位,从2011年 |
MIPS | mips | 32位,从2012年 |
ARMv8 | arm64-v8a | 64位,从2014年 |
MIPS64 | mips64 | 64位,从2014年 |
x86_64 | x86_64 | 64位,从2014年 |
相应生成arm64-v8a,mips64,x86_64下的文件需要NDK_r10以上版本支持。在Application.mk文件里配置APP_ABI的内容。例如指明某个具体的CPU架构
APP_ABI := arm64-v8a
或者直接生成所有的版本
APP_ABI := all
注意:根据不同的NDK版本,APP_ABI := all仅能生成当前版本支持的ABI信息库文件,如果需要生成最新的必须更新相应的NDK版本。
或者明确写明支持的CPU架构
APP_ABI := armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64
建议采用该方法
注意:由于目前版本支持的问题,采用Eclipse+NDK+Windows集成方式开发,对应编译生成对应CPU架构的so文件是没有问题的。但是不一定可以执行调试工作,启动NDK调试模式时将会提示无法识别对应的ABI。
注意:(1)、目前模拟器只有x86_64的没有arm64-v8a的;(2)、在用真机测试armv8-a时,最好先通过adb shell, cat /proc/cpuinfo ,来查看下真机是否是支持armv8-a;(3)、arm32和arm64有些配置参数不能共存,如-msoft-float仅在arm32位下支持,在arm64位下是不支持的.
最近碰到了一个问题,就是在使用环信的demo基础上合入声网的基本功能。
单独使用两个都是没有问题的,但是合入声网后,触发声网的直播功能,就崩溃,要命的是log太多导致最后关键的log没有打印出来:
java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader
[DexPathList[[
dex file “/data/data/cn.ucai.superwechat/files/instant-run/dex/slice-volley-1.0.19_4b75c04313a180e03835a6930735dac9f649eb7e-classes.dex”,
dex file … … “/data/data/cn.ucai.superwechat/files/instant-run/dex/slice-com.jakewharton-butterknife-8.4.0_60f696a2b009fbd2a8102eba041159c264b6cf2d-classes.dex”, dex file “/data/data/cn.ucai.superwechat/files/instant-run/dex/slice-com.android.su
各种调试,回退都没有解决,后面在声网的文档中发现如下
所需库
Agora Native SDK for Android为NDK原生库,提供armeabi-v7a和x86平台的二进制包,以及Java 包装类(Java wrapper),开发者可使用其API接口进行开发。详见 直播API参考说明-Android。
将Agora Native SDK中libs文件夹下的以下库复制到项目的libs文件夹下:
- armeabi-v7a/
- x86/
- agora-rtc-sdk.jar
对比上文可以知道上面的两个存放so文件的文件夹都是32位的,在官方的论坛中也找到类似的提问,答案都是声网暂时只有32位的so文件,没有64位的。
在环信的代码中,有对easeUI的依赖,其中导入了很多的so文件,并且有arm64-v8a这个文件夹,由此可知环信的so文件对32位和64位都有提供。
解决办法就是删除环信中arm64-v8a文件夹,新建armeabi-v7a文件夹,将armeabi文件夹中的so文件拷贝到armeabi-v7a中。
这样,环信和声网就都只提供32位的so文件,如果手机是64位的就默认都使用32位的,不会因为环信有64位,导致系统直接去找声网的64位的so文件了。