NDK开发,交叉编译库给Android使用

155 阅读2分钟

NDK开发,交叉编译库给Android使用

1.简单的交叉编译

在Linux中写一个测试的c程序

image-20241014223341533.png

编译 gcc test.c -o mainexe

image-20241014223454459.png

执行一把

image-20241014223601964.png

现在是在Linux平台执行的没问题,我们导入到Android设备中试一下。是执行不了会报错的not executable:64-bit ELF file,非交叉编译的 执行文件,能在安卓文件系统中运行

image-20241014224433067.png

请出Android ndk的gcc来编译

先查看手机的cpu架构

image-20241014230307520.png

定义环境变量export NDK_GCC=/home/android/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

image-20241014231306527.png

报错了,找不到#include<stdio.h>头文件

image-20241014231445617.png

头文件会自动寻找库文件

image-20241014232759331.png

//把头文件需要的库文件导入

【-isystem(寻找指定目录的头文件)重点是头文件, 包括 stdio.h、std1ib.h 等等】

【--sysroot=路径(自动寻找 头文件 和 库文件,由于此路径只有库文件,那么头文件找不到,但是库文 件找到了)】

export AAA="--sysroot=/home/android/ndk/android-ndk-r17c/platforms/android-28/arch-arm64 -isystem /home/android/ndk/android-ndk-r17c/sysroot/usr/include -isystem /home/android/ndk/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"

头文件路径

image-20241014234308392.png

设置环境变量,又报错了。找不到头文件,stdio.h 执行过程中,会寻找ams 支持,他现在找不到,奔溃

image-20241014234849502.png

最终加上这行-isystem /home/android/ndk/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi

export AAA="--sysroot=/home/android/ndk/android-ndk-r17c/platforms/android-28/arch-arm64 -isystem /home/android/ndk/android-ndk-r17c/sysroot/usr/include -isystem /home/android/ndk/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"

加上pie参数,否则还是无法在Android设备上运行,有权限问题。

image-20241015232742955.png

然后再导出运行到手机上即可,前提是手机系统必须是root权限用户,否则也是没权限的。

2.Android和Linux的关系角色

配置环境变量

#ndk linux平台的支持
export NDK = "/home/android/ndk/android-ndk-r17c"
#把ndk设置到linux的环境变量里面去
export PATH = $NDK:$PATH



#交叉编译配置相关
export NDK_GCC_x86="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc"
export NDK_GCC_x64="$NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-gcc"
export NDK_GCC_arm="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"
export NDK_GCC_arm_64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc"

export NDK_CFIG_x86="--sysroot=$NDK/platforms/android-28/arch-x86 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/i686-linux-android"
export NDK_CFIG_x64="--sysroot=$NDK/platforms/android-28/arch-x86_64 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/x86_64-linux-android"
export NDK_CFIG_arm="--sysroot=$NDK/platforms/android-28/arch-arm -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/arm-linux-androideabi"
export NDK_CFIG_arm_64="--isysroot=$NDK/platforms/android-21/arch-arm64 -isystem $NDK/sysroot/usr/include -isystem -isystem $NDK/sysroot/usr/include/aarch64-linux-android"

export NDK_AR_x86="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ar"
export NDK_AR_x64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"
export NDK_AR_arm="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar"
export NDK_AR_arm_64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"


# 静态库 动态库相关
export myd="$NDK_GCC_arm $NDK_CFIG_arm -fPIC -shared "
export myj="$NDK_AR_arm rcs "

3.linux中交叉编译出动态库和静态库

Linux服务器可以用的 动态库:

image-20241017232803798.png

Android可以用的 动态库:交叉编译

image-20241017233354597.png

修改环境变量需要执行这个才会生效

image-20241017233343171.png