NDK交叉编译给Android用

对于交叉编译,很多人是一知半解的,因为它的确有一点难度。下面对交叉编译做一个总结。

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文件用)

注:对于不同版本的平台可能会有一些错误。

你可能感兴趣的:(NDK交叉编译给Android用)