NDK环境的搭建

下载JDK和cmdline-tools

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用Android Gradle plugin 7.0构建时需要JDK 11才能运行Gradle
https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_windows-x64_bin.zip
https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz

# 位于 $ANDROID_HOME/cmdline-tools 下的命令行工具包已经取代了原来的 $ANDROID_HOME/tools 工具包
https://dl.google.com/android/repository/commandlinetools-win-8512546_latest.zip
https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip

# 解压上面下载的openjdk和cmdline-tools到你自己设置的 $ANDROID_HOME,下面是我的
# Windows下的:ANDROID_HOME=D:\Android
# Linux 下 的:ANDROID_HOME=/home/leux/Android

$ANDROID_HOME/jdk-11.0.2/
$ANDROID_HOME/cmdline-tools/latest/ # cmdline-tools默认解压到此目录内

配置NDK和SDK的编译环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# SDK管理命令位于:$ANDROID_HOME/cmdline-tools/$version/bin/sdkmanager
sdkmanager --lis // 列出已安装和可用的软件包,--sdk_root=path可使用指定的SDK路径而不是默认路径
sdkmanager --update // 更新所有已安装的软件包
sdkmanager --install "ndk;25.1.8937393" "cmake;3.22.1" // 安装指定NDK版本,也可选装包含ninja的CMAKE套件
sdkmanager "platforms;android-33" "build-tools;33.0.0" "platform-tools" // 安装platforms,build-tools,platform-tools

# Windows下配置环境
set JAVA_HOME=D:\Android\jdk-11.0.2
set ANDROID_HOME=D:\Android
set ANDROID_NDK=D:\Android\ndk\25.1.8937393
set PATH=%PATH%;%JAVA_HOME%\bin;%ANDROID_NDK%;%ANDROID_HOME%\cmdline-tools\latest\bin;%ANDROID_HOME%\build-tools\33.0.0
set PATH=%PATH%;%ANDROID_HOME%\cmake\3.22.1\bin;D:\Android\gradle-7.5\bin

# Linux下配置环境
export JAVA_HOME=/home/leux/Android/jdk-11.0.2/
export ANDROID_HOME=/home/leux/Android
export ANDROID_NDK=$ANDROID_HOME/ndk/25.1.8937393
export PATH=$PATH:$JAVA_HOME/bin:$ANDROID_NDK:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/build-tools/33.0.0
export PATH=$PATH:$ANDROID_HOME/cmake/3.22.1/bin

# 默认安装完成后目录大致如下:
~/Android/
├── jdk-11.0.2/
├── platform-tools/
├── ndk/25.1.8937393/
├── build-tools/33.0.0/
├── platform/android-33/
└── cmdline-tools/latest/

编译官方NDK示例

  1. 官方推荐的 CMake + gradle 新式编译法
1
2
3
4
5
6
git clone https://github.com/android/ndk-samples.git
cd ndk-samples/hello-jni

# CMakeLists.txt可不需要执行ndk-build构建项目
./gradlew // 检查编译环境
./gradlew assembleDebug // 编译并打Debug包
  1. ndk-build + gradle 传统编译法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
git clone https://github.com/android/ndk-samples.git -b android-mk
cd ndk-samples/hello-jni/jni
ndk-build // 编译生成库

# ndk-build 可接选项
clean
-B V=1 // -B 强制执行完整的重新构建,V=1 显示构建命令
-C <project> // 构建位于 <project> 的项目路径的原生代码
NDK_DEBUG=1 // 是否强制执行可调试构建
NDK_HOST_32BIT=1 // 始终使用32位模式下的工具链
NDK_APPLICATION_MK=Application.mk // 指定Application.mk文件进行构建

# Application.mk 指定 ndk-build 的项目级设置
APP_ABI // armeabi-v7a arm64-v8a x86 x86_64 all
APP_STL // 此应用用的C++标准库,包括 c++_shared、c++_static 和 none
APP_OPTIM // 可选 release 或 debug
APP_MODULES // 要构建的模块的显式列表
APP_PLATFORM // 声明构建此应用所面向的API级别,并对应于应用的minSdkVersion
APP_PROJECT_PATH // 项目根目录的绝对路径
APP_MANIFEST // AndroidManifest.xml 文件的绝对路径
APP_CFLAGS // 为项目中的所有 C/C++ 编译传递的标记
APP_LDFLAGS // 关联可执行文件和共享库时要传递的标记

# Android.mk 用于向构建系统描述源文件和共享库及定义环境变量
  1. Android.mk + apktool手动打包
1
2
3
4
ndk-build				// 编译生成库
# 将lib库打包成apk后再给打包的apk签名
java -jar tools/apktool_2.6.1.jar b -f -o tmp.apk ./
java -jar tools/apksigner.jar sign --key tools/apkeasytool.pk8 --cert tools/apkeasytool.pem --out out.apk tmp.apk
  1. 具体的查看官方的从命令行构建您的应用