当然可以。下面是对 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 { ...
ndk { abiFilters "armeabi-v7a", "arm64-v8a" }
externalNativeBuild { cmake { cppFlags "-std=c++11" } } }
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 ) { 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-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
的高级配置,我也可以继续讲。需要吗?