在Windows上交叉编译so库和a库

448 阅读2分钟

如果没有Linux环境请先参考这个文章安装:juejin.cn/post/736175…

涉及以下三个知识点:
输出可执行文件:
gcc xxx.c -o libxxx

编译so命令:
gcc -fPIC -shared xxx.c -o libxxx.so

编译静态库命令:
先要转变成.o文件,才能转变成.a文件;
转变成.o:
gcc -fPIC -c xxx.c -o xxx.o
转变成.a:
ar rcs -o libxxx.a xxx.o

输出可执行文件:

1.下载Linux系统的NDK文件:developer.android.google.cn/ndk/downloa… ,笔者所用的版本是:googledownloads.cn/android/rep…

#在Linux系统的命令窗口执行,以下命令获取ndk压缩包
wget https://googledownloads.cn/android/repository/android-ndk-r26d-linux.zip
#解压缩:
unzip android-ndk-r26d-linux.zip

2.编写shell脚本(build.sh):

#gcc Android平台的GCC
export NDK_GCC="/home/xxx/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"

#--sysroot 寻找头文件和库文件
#-isystem 寻找头文件
export Params="--sysroot=/home/xxx/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/xxx/NDK/android-ndk-r17c/sysroot/usr/include/ -isystem /home/xxx/NDK/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android/"

#-pie 必须要添加的参数
$NDK_GCC -pie $Params main.c -o mainBuild

3.执行脚本:

sh ./build.sh

输出静态文件:

在/etc/profile文件中配置:

#执行
vim /etc/profile

#进入编辑模式输入
#开始配置ndk交叉编译环境
#添加环境变量
export NDK="/home/xx/NDK/android-ndk-r17c"
export PATH=$PATH:$NDK

#配置GCC环境变量
export NDK_GCC_arm="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"
export NDK_GCC_x64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc"

#配置参数库文件和头文件依赖目录
export NDK_CFIG_arm="--sysroot=$NDK/platforms/android-21/arch-arm -isystem $NDK/sysroot/usr/include/ -isystem $NDK/sysroot/usr/include/arm-linux-androideabi/"
export NDK_CFIG_x64="--sysroot=$NDK/platforms/android-21/arch-arm64 -isystem $NDK/sysroot/usr/include/ -isystem $NDK/sysroot/usr/include/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_x64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"

保存之后执行

source /etc/profile

环境变量生效之后替换静态打包命令:

#输出.o文件:
$NDK_GCC_arm $NDK_CFIG_arm -fPIC -c xxx.c -o xxxx.o
#输出.a文件:
$NDK_AR_arm rcs -o libxxx.a xxx.o

输出动态so文件:

环境变量参考静态配置环境变量,生效之后替换动态打包命令:

#输出.so文件:
$DNK_GCC_x64 $NDK_CFIGg_x64 -fPIC xx.c -o libxxx.so

最后在Android studio中导入静态动态库,并运行程序,大功告成!