在Clion开发工具上使用NDK编译可以在安卓上执行的程序

1. 前言

        因为工作需要,我要将一份C语言代码编译成可执行文件传送到某安卓系统里执行。

        众所周知,使用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的默认工具链都是独立工具链了,不需要再创建了。

        本文记录在Clion开发工具上使用NDK编译可以在安卓上执行程序的配置步骤。

2. NDK下载安装

从以下路径下载NDK

NDK 下载  |  Android NDK  |  Android Developers

选择 Windows 64 位 发表此博客时,最新版本是

android-ndk-r25c-windows.zip

我意外的选了个 不受支持的旧版本android-ndk-r19c,小伙伴们请安装最新的。

下载后解压缩。

然后将解压后的目录配置到系统环境变量 path 中

 CMD执行命令

ndk-build.cmd -v

看看是否安装成功

 OK,显示除了版本号,安装成功。

3.Clion配置与执行

        打开Clion,新建一个C project。

        打开菜单File->Settings->Build,Execution,Deployment->Toolchains,点击加号选择“MinGW”新建一个工具链,如果系统没有MinGW的话,可以点击菜单右边的“Download”,在新打开的网页中点击“Sourceforge”进行下载安装,安装完成后还需要添加环境变量。

        我的环境已经有了MinGw, 工具链配置如下图所示

主要是Make、C Compiler、C++ Compiler这三个路径的配置。

打开菜单File->Settings->Build,Execution,Deployment->CMake,点击加号添加新的CMake项目配置,Name名字随便起。Toolchains选择刚才的工具链配置。 CMake options点击右边的展开,输入以下配置项。

 CMake options配置内容复制如下:

-DCMAKE_TOOLCHAIN_FILE="D:\softwaretmp\android-ndk-r19c-windows-x86_64\android-ndk-r19c\build\cmake\android.toolchain.cmake"
-DCMAKE_SYSTEM_NAME=Android
-DANDROID_ABI=arm64-v8a
-DCMAKE_ANDROID_NDK="D:\softwaretmp\android-ndk-r19c-windows-x86_64\android-ndk-r19"
-DCMAKE_SYSTEM_VERSION=19
-DCMAKE_C_FLAGS=""
-DCMAKE_CXX_FLAGS=""
-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang

        其中最重要的是CMAKE_TOOLCHAIN_FILE、CMAKE_SYSTEM_NAME以及ANDROID_ABI这三项的配置,第一个指定ndk的CMake配置文件,它位于/build/cmake/android.toolchain.cmake,第二个是目标系统平台,这里为Android,第三个是架构,这里手机CPU是arm64-v8a架构的,所以用arm64-v8a。

查看CMakelists.txt,如下,未做改动

cmake_minimum_required(VERSION 3.23)
project(C_plus_test)

set(CMAKE_CXX_STANDARD 14)

add_executable(C_plus_test main.cpp)

        配置完成,写一个最简单的hello world程序测试以下:

#include <stdio.h>

int main()
{
    printf("hello world\n");
    return 0;
}

点击编译:

执行日志:

"D:\Program Files\JetBrains\CLion 2022.2.4\bin\cmake\win\bin\cmake.exe" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=D:/softwaretmp/android-ndk-r19c-windows-x86_64/android-ndk-r19c/prebuilt/windows-x86_64/bin/make.exe -DCMAKE_C_COMPILER=D:/softwaretmp/android-ndk-r19c-windows-x86_64/android-ndk-r19c/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe -DCMAKE_CXX_COMPILER=D:/softwaretmp/android-ndk-r19c-windows-x86_64/android-ndk-r19c/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe -DCMAKE_TOOLCHAIN_FILE=D:\softwaretmp\android-ndk-r19c-windows-x86_64\android-ndk-r19c\build\cmake\android.toolchain.cmake -DCMAKE_SYSTEM_NAME=Android -DANDROID_ABI=arm64-v8a -DCMAKE_ANDROID_NDK=D:\softwaretmp\android-ndk-r19c-windows-x86_64\android-ndk-r19 -DCMAKE_SYSTEM_VERSION=19 -DCMAKE_C_FLAGS= -DCMAKE_CXX_FLAGS= -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -G "CodeBlocks - MinGW Makefiles" -S C:\Users\harry_zhang\CLionProjects\C_plus_test -B C:\Users\harry_zhang\CLionProjects\C_plus_test\cmake-build-debug-mingw
-- ANDROID_PLATFORM not set. Defaulting to minimum supported version
16.
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/softwaretmp/android-ndk-r19c-windows-x86_64/android-ndk-r19c/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/softwaretmp/android-ndk-r19c-windows-x86_64/android-ndk-r19c/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/harry_zhang/CLionProjects/C_plus_test/cmake-build-debug-mingw

[Finished]

由于ANDROID_PLATFORM没有设置,系统默认取最小值16。

根据编译打印的最后一行,打开目录 C:/Users/harry_zhang/CLionProjects/C_plus_test/cmake-build-debug-mingw

这里的C_plus_test就是生成的文件。这个名字是我clion新建项目时随便取的。

4.adb传送到安卓设备调试成功

devicename:/data/local/tmp # ls -l | grep C_plus_test
-r--r--r-- 1 shell shell     10344 2023-03-21 19:18 C_plus_test
devicename:/data/local/tmp # chmod +x C_plus_test
devicename:/data/local/tmp # ./C_plus_test
hello world

执行成功。

5.最后

        其实我的安卓环境应该 APP_PLATFORM=android-29,但是低版本也是可以执行的。

        如果你想改会原来的编译和执行环境,可以选择Custom Compier,打勾保存,即可。

猜你喜欢

转载自blog.csdn.net/qq_33163046/article/details/129695472