NDK开发,交叉编译库给Android使用
1.简单的交叉编译
在Linux中写一个测试的c程序
编译 gcc test.c -o mainexe
执行一把
现在是在Linux平台执行的没问题,我们导入到Android设备中试一下。是执行不了会报错的not executable:64-bit ELF file,非交叉编译的 执行文件,能在安卓文件系统中运行
请出Android ndk的gcc来编译
先查看手机的cpu架构
定义环境变量export NDK_GCC=/home/android/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
报错了,找不到#include<stdio.h>头文件
头文件会自动寻找库文件
//把头文件需要的库文件导入
【-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"
头文件路径
设置环境变量,又报错了。找不到头文件,stdio.h 执行过程中,会寻找ams 支持,他现在找不到,奔溃
最终加上这行-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设备上运行,有权限问题。
然后再导出运行到手机上即可,前提是手机系统必须是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服务器可以用的 动态库:
Android可以用的 动态库:交叉编译
修改环境变量需要执行这个才会生效