对于交叉编译,很多人是一知半解的,因为它的确有一点难度。下面对交叉编译做一个总结。
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
然后进行编译
但是这样会显得有点麻烦,在这里可以先设置临时变量进行编译
所以我们要去引入库文件:
就是在这个include文件夹里继续配置临时环境变量
echo的意思是看看这个环境变量是否存在至此再进行编译
会出现如上错误 还要调用asm c语言再运行时候没有,额外配置把它配置临时环境变量后,就成功了。(以上命令总:)
成功输出了mainNDKEXE,这就是NDK编译成功的可放在Android执行的文件
4.交叉编译c代码给Android使用
编写c代码(vim编辑器编写):
vim get.h
编写声明文件vim get.c
在linux中编译动态库和静态库:
动态库:
静态库:
前提:必须要有目标文件 xxx.o作为辅助
-c 产生目标文件. -o 输出get.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”
配置该环境变量
配置ar的临时环境变量编译.o文件:
生成.o文件生成静态库:
至此,NDK交叉编译完成。
5.Android的使用
将上面编译成功的静态库和动态库复制到Andorid studio文件目录下:
目录结构如上:创建jniLibs目录,将动态库文件复制到该文件夹下,静态库文件到cpp下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文件用)
注:对于不同版本的平台可能会有一些错误。
网友评论