美文网首页
NDK交叉编译给Android用

NDK交叉编译给Android用

作者: 来个Android小哥 | 来源:发表于2021-06-08 09:31 被阅读0次

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

    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用

          本文链接:https://www.haomeiwen.com/subject/xfkleltx.html