Android NDK 开发

so 编译平台 <a href="https://cloud.tencent.com/developer/article/2038519">ref</a> #

Android中在进行NDK开发的时候,都知道因为机型杂而多的原因,没有一个大的标准,所以很多厂商都会采用不同型号的cpu,那么在编译so文件的时候,就需要进行交叉编译出多个cpu平台版本,现在主流的cpu架构版本:

  • armeabi/armeabi-v7a:arm 32bit,主要用于 Android4.0 之后;
  • arm64-v8:arm 64bit,主要用于 Android5.0 之后;
  • x86/x86_64:这个架构是x86类型的,有32位和64位,占用的设备比例比较小

这里可以看到,其中arm类型的是往下兼容策略,比如arm64-v8a肯定兼容armeabi/armeabi-v7a,也就是说armeabi/armeabi-v7a架构的so文件可以用在arm64-v8a的设备中的,而armeabi-v7a也是兼容armeabi的,但是因为cpu型号不同,所以arm体系和x86体系之间是不能相互兼容的。

查看架构 <a href="https://stackoverflow.com/a/58647758">ref</a> #

命令行 #

$ cat /proc/cpuinfo | grep arch

CPU architecture: 7 # 32bit
CPU architecture: 8 # 64bit

Java(未验证) #

if(Build.SUPPORTED_64_BIT_ABIS.length > 0)
	// 64bit
else
	// 32bit

so 加载流程 #

1、调用System.loadLibrary和System.load方法进行加载so文件

2、通过Runtime.java类的nativeLoad方法进行最终调用,这里需要通过类加载器获取到nativeLib路径。

3、到底层之后,就开始使用dlopen方法加载so文件,然后使用dlsym方法调用JNI_OnLoad方法,最终开始了so的执行。