众所周知,使用ndk编译代码有三种使用方式,分别是基于 Make 的 ndk-build、CMake以及独立工具链。以前进行ndk编程都是使用ndk-build进行的,新建jni目录,编写Android.mk和Application.mk,使用Notepad++进行代码编写,然后执行ndk-build进行编译。不过随着项目越来越大,这种基于记事本的编辑简直无法忍受了,于是想到了使用CLion IDE进行代码的编写和编译。CLion使用的是CMake进行项目构建的。
在ndk r19版本以前,要在CLion上编译ndk只能采用独立工具链的方式,创建独立工具链供CLion调用,官方文档如下:
不过r19之后,ndk的默认工具链都是独立工具链了,不需要再创建了。截止至2020.7.1,最新的NDK版本为21.0.6113669,本文将基于该ndk版本使用CLion进行编程。
1.工具链配置
首先安装CLion和ndk工具包,然后新建工程,打开菜单File->Settings->Build,Execution,Deployment->Toolchains,点击加号选择“MinGW”新建一个工具链,如果系统没有MinGW的话,可以点击菜单右边的“Download”,在新打开的网页中点击“Sourceforge”进行下载安装,安装完成后还需要添加环境变量,网上教程很多就不再赘述了。这里我装在C盘,工具链配置如下图所示,主要是Make、C Compiler、C++ Compiler以及Debugger这四个路径的配置。
其中"\ndk\21.0.6113669\"为你的ndk根目录,根目录结构如下图所示。
2.CMake配置
打开菜单File->Settings->Build,Execution,Deployment->CMake,点击加号添加新的CMake项目配置,Name名字随便起。Toolchains选择刚才的工具链配置。 CMake options点击右边的展开,输入以下配置项。
-DCMAKE_TOOLCHAIN_FILE="D:\AndroidStudioSDK\ndk\21.0.6113669\build\cmake\android.toolchain.cmake"
-DCMAKE_SYSTEM_NAME=Android
-DANDROID_ABI=arm64-v8a
-DCMAKE_ANDROID_NDK="D:\AndroidStudioSDK\ndk\21.0.6113669"
-DCMAKE_SYSTEM_VERSION=24
-DCMAKE_C_FLAGS=""
-DCMAKE_CXX_FLAGS=""
-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang
CMake配置如下图所示,下面的三项可以留空。。
其中最重要的是CMAKE_TOOLCHAIN_FILE、CMAKE_SYSTEM_NAME以及ANDROID_ABI这三项的配置,第一个指定ndk的CMake配置文件,它位于<NDK>/build/cmake/android.toolchain.cmake,第二个是目标系统平台,这里为Android,第三个是架构,这里手机CPU是arm64-v8a架构的,所以用arm64-v8a。具体配置参考项可以访问官方文档,左上角选择CMake版本即可查看。
3.编译下载
演示就用最简单的Hello World!吧,main.c代码如下。
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
CMakeLists.txt配置如下。
cmake_minimum_required(VERSION 3.16)
project(Demo C)
set(CMAKE_C_STANDARD 11)
add_executable(Demo main.c)
点击左边的锤子图标即可编译,编译完成后文件生成在cmake-build-CMake配置名目录下。
使用adb下载到手机或模拟器,赋给可执行权限,然后执行即可看到效果,JNI编程则引入头文件jni.h并把项目类型改为Libray即可生成so库。