对于交叉编译,很多人是一知半解的,因为它的确有一点难度。下面对交叉编译做一个总结。
1.NDK的介绍
1.NDK(Native Development Kit),是一个Andorid的一个工具开发包。
2.能将c,c++编译成动态库(.so),和静态库(.a)
2.NDK的使用(我这里的系统环境是mac)
1.下载NDK
(1)从官网上下载NDK
https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip?h1=zh_cn
选择对应的NDK版本就行
(2)用命令下载

2.重命名NDK(方便解压)
mv android-ndk-r17c-darwin-x86_64.zip\?h1\=zh_cn android-ndk-r17c-darwin-x86_64.zip

3.NDK的使用
这里我用vim编辑器进行编写c代码
vim main.c

执行命令编译成可执行文件

因为我们要给Android用,所以执行命令:
adb命令请查阅相关文档。

会发现执行不了:因为这里用到的不是Android NDK gcc编译出来的可执行文件。

所以寻找Android NDK的gcc:
发现在NDK这个文件夹里:
android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-gcc”


当找到这里的时候有很多个版本,这里就看手机架构的版本了:

所以选择AArch64版本的

所以进入这个文件夹:
找到bin目录

找到对应版本的gcc

然后进行编译

但是这样会显得有点麻烦,在这里可以先设置临时变量进行编译

所以我们要去引入库文件:



继续配置临时环境变量

至此再进行编译


把它配置临时环境变量后,就成功了。(以上命令总:)

成功输出了mainNDKEXE,这就是NDK编译成功的可放在Android执行的文件
4.交叉编译c代码给Android使用
编写c代码(vim编辑器编写):
vim get.h

vim get.c

在linux中编译动态库和静态库:
动态库:

静态库:
前提:必须要有目标文件 xxx.o作为辅助

再生成.a静态库:

在Android中编译动态库和静态库:
动态库:

静态库:
前提:必须要有目标文件 xxx.o作为辅助,生成静态库之前需要NDK中的ar生成.o文件
“android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ar”
配置该环境变量

编译.o文件:

生成静态库:

至此,NDK交叉编译完成。
5.Android的使用
将上面编译成功的静态库和动态库复制到Andorid studio文件目录下:

CMakeList文件如下:
运行静态库时:

Native-lib.cpp文件如下

运行结果:

运行动态库时:
运行动态库其余不变: CMakeList配置:

运行结果:

至此,NDK交叉编译完成。
总结:编译需要以下几个文件:
1.gcc : export NDK_GCC=“/Users/macxito/NDK24/NDKPWW/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-gcc” (交叉编译用)
2.export AAA="--sysroot=/Users/macxito/NDK24/NDKPWW/android-ndk-r17c/platforms/android-21/arch-arm64 -isystem /Users/macxito/NDK24/NDKPWW/android-ndk-r17c/sysroot/usr/include -isystem /Users/macxito/NDK24/NDKPWW/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android"
第一段:Users/macxito/NDK24/NDKPWW/android-ndk-r17c/platforms/android-21/arch-arm64 寻找库文件
第二段:/Users/macxito/NDK24/NDKPWW/android-ndk-r17c/sysroot/usr/include 寻找头文件
第三段:/Users/macxito/NDK24/NDKPWW/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android 寻找asm用
3. export NDK_AR="/Users/macxito/NDK24/NDKPWW/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ar" (用于编译静态库.o文件用)
注:对于不同版本的平台可能会有一些错误。

网友评论