NDK

当然可以。下面是对 NDK(Native Development Kit) 的讲解以及在 Android 项目中配置和使用 NDK 的方法总结,包括一个完整的示例。


一、什么是 NDK?

NDK 是 Native Development Kit 的缩写,是 Android 官方提供的一套工具,可以使用 C/C++ 编写一部分 Android 应用代码,并将其编译为本地机器码以提高性能或复用已有的 C/C++ 库。

使用 NDK 的常见场景:

  • 需要更高性能的计算,如图像处理、音视频编解码、游戏引擎等。
  • 调用已有的 C/C++ 库(如 FFmpeg、OpenCV、libcurl)。
  • 实现底层安全逻辑(尽管这并不能完全防止反编译)。

二、NDK 的基本组成

  • .cpp/.c:C/C++ 源文件
  • Android.mk / CMakeLists.txt:构建脚本
  • jniLibs/:存放编译好的 .so 文件
  • ndk-build / CMake:构建工具
  • gradle:集成到 Android 工程

三、NDK 的配置方法

✅ 步骤 1:安装 NDK 和 CMake

在 Android Studio 中:

1
File -> Settings -> Appearance & Behavior -> System Settings -> Android SDK -> SDK Tools

勾选:

  • NDK (Side by side)
  • CMake
  • LLDB(可选)

✅ 步骤 2:配置 Gradle

假设我们使用的是 CMake

build.gradle (app) 中添加:

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
android {
...

defaultConfig {
...

// 指定 .so 支持的架构
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}

// 如果使用 CMake,则指定 CMake 构建文件路径
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
}
}
}

// 指定 CMakeLists.txt 路径
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
}

✅ 步骤 3:添加 native 代码和 CMake 文件

文件结构:

1
2
3
4
5
6
7
8
9
app/
└── src/
└── main/
├── cpp/
│ ├── native-lib.cpp
│ └── CMakeLists.txt
└── java/
└── com/example/ndkdemo/
└── MainActivity.java

native-lib.cpp 示例:

1
2
3
4
5
6
7
8
9
10
11
#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_ndkdemo_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}

CMakeLists.txt 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cmake_minimum_required(VERSION 3.4.1)

add_library( # 名称
native-lib

# 类型
SHARED

# 源文件
native-lib.cpp )

find_library( # log 库
log-lib

log )

target_link_libraries( # 目标库
native-lib

# 依赖的系统库
${log-lib} )

✅ 步骤 4:在 Java/Kotlin 中调用 native 方法

Kotlin 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MainActivity : AppCompatActivity() {

external fun stringFromJNI(): String

companion object {
init {
System.loadLibrary("native-lib")
}
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("NDK", stringFromJNI())
}
}

四、多模块项目如何组织 NDK?

每个 module 都可以有自己的 CMakeLists.txt,在其对应的 build.gradle 中分别指定。例如:

1
2
:app -> 引用模块
:nativecore -> 存放 C/C++ 源码和 native 接口

nativecore/build.gradle

1
2
3
4
5
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}

然后在 app 模块中调用该模块中的 native 方法(通过 AAR 依赖或 System.loadLibrary)。


五、小结

项目 内容
使用场景 性能优化/调用现有C库
构建系统 CMake(推荐) 或 ndk-build
配置方式 build.gradle + CMakeLists.txt
编写语言 C 或 C++(推荐 C++11)
调用方式 JNI

如果你需要我提供使用 ndk-build(使用 Android.mk)的示例或者在多模块项目中精细拆分 NDK 的高级配置,我也可以继续讲。需要吗?