前言
在开发一个需要Native代码的jar包的时候,我们可以单独编译Native代码成so库,而不需要使用Android Studio进行编译,这样在开发通用Native代码的时候可以节省很多时间。
设置环境变量
设置ANDROID_HOME/ANDROID_SDK_HOME变量,该目录为安装Android Studio时候设置的SDK目录,比如我的目录为D:\Library\Android\sdk
,那么设置该变量为此地址即可。
编译脚本build.bat
:
set abi=arm64-v8a
if not exist %abi% md %abi%
cd %abi%
%ANDROID_SDK_HOME%/cmake/3.22.1/bin/cmake ^
-DANDROID_ABI=%abi% ^
-DANDROID_NDK=%ANDROID_SDK_HOME%/ndk/25.1.8937393 ^
-DCMAKE_BUILD_TYPE=Debug ^
-DCMAKE_TOOLCHAIN_FILE=%ANDROID_SDK_HOME%/ndk/25.1.8937393/build/cmake/android.toolchain.cmake ^
-DANDROID_NATIVE_API_LEVEL=19 ^
-DANDROID_TOOLCHAIN=clang -DCMAKE_GENERATOR="Ninja" ^
-DCMAKE_MAKE_PROGRAM=%ANDROID_SDK_HOME%/cmake/3.22.1/bin/ninja ^
..
%ANDROID_SDK_HOME%/cmake/3.22.1/bin/ninja
cd ..
以上脚本参考自Ref 1
,做了一些简单的错误更正和微调,其中DANDROID_NDK
的设置需要定位到D:\Library\Android\sdk\ndk\25.1.8937393
,而不是内层的build目录。
针对MacOS平台:
#!/usr/bin/env sh
echo "========== Compile Android *.so =========="
abi="arm64-v8a"
NDK_VERSION="27.0.11718014"
ANDROID_SDK_HOME="/Users/winter/Library/Android/sdk"
ANDROID_NDK_PATH="$ANDROID_SDK_HOME/ndk/$NDK_VERSION"
CMAKE_VERSION="3.22.1"
if [ ! -d "bins" ]; then
mkdir "bins"
fi
cd bins
# bins/arm64-v8a
if [ ! -d $abi ]; then
mkdir $abi
fi
cd $abi
$ANDROID_SDK_HOME/cmake/$CMAKE_VERSION/bin/cmake \
-DANDROID_ABI=$abi \
-DANDROID_NDK=$ANDROID_NDK_PATH \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_PATH/build/cmake/android.toolchain.cmake \
-DANDROID_NATIVE_API_LEVEL=21 \
-DANDROID_TOOLCHAIN=clang -DCMAKE_GENERATOR="Ninja" \
-DCMAKE_MAKE_PROGRAM=$ANDROID_SDK_HOME/cmake/$CMAKE_VERSION/bin/ninja \
../..
$ANDROID_SDK_HOME/cmake/$CMAKE_VERSION/bin/ninja
基本变量解释:
ANDROID_ABI:目标ABI,支持armeabi-v7a,arm64-v8a等。
ANDROID_NDK:NDK的目录。
ANDROID_TOOLCHAIN:编译Cmake使用的工具链,默认clang
ANDROID_NATIVE_API_LEVEL:编译Android NDK的API级别
CMAKE_TOOLCHAIN_FILE:Cmake编译链接时的cmake文件
CMAKE_MAKE_PROGRAM:make程序选择