使用 Android NDK 编译库的入门指南

在 Android 开发中,使用 NDK(Native Development Kit)可以帮助我们编写高性能的代码,特别是当我们需要使用 C/C++ 进行复杂运算时。对于初学者,NDK 的使用可能会让人感到困惑。本文将带你详细了解如何使用 Android NDK 编译库,且逐步展示实现过程。

整体流程

下面是使用 Android NDK 编译库的基本步骤:

步骤 描述
1. 安装 NDK 在 Android Studio 中安装 NDK
2. 创建项目 创建新的 Android 项目
3. 配置 CMake 创建和配置 CMakeLists.txt 文件
4. 编写 C/C++ 代码 实现你的库的功能
5. 写 Java 接口 使用 JNI(Java Native Interface)与 Java 代码交互
6. 构建项目 使用 Gradle 构建项目
7. 测试库 在 Android 模拟器或设备上测试应用

接下来,我们将详细说明每一步。

1. 安装 NDK

在 Android Studio 中,你可以通过以下步骤安装 NDK:

  1. 打开 Android Studio。
  2. 点击 File > Settings(或 MacOS 上的 Android Studio > Preferences)。
  3. 在左侧面板中,选择 Appearance & Behavior > System Settings > Android SDK
  4. 点击 SDK Tools 标签页,勾选 NDK (Side by side),然后点击 OK

2. 创建项目

创建一个新的 Android 项目,你可以选择 “Empty Activity” 模板:

  1. 打开 Android Studio。
  2. 点击 Create New Project
  3. 选择 Empty Activity 进行项目配置。
  4. 输入项目名称,包名,选择存储位置,然后点击 Finish

3. 配置 CMake

在项目根目录下创建一个名为 CMakeLists.txt 的文件,以下是一个基本的 CMake 列表文件示例:

cmake_minimum_required(VERSION 3.4.1)

# 定义库的名称和源文件
add_library(native-lib SHARED native-lib.cpp)

# 查找 log 库
find_library(log-lib log)

# 将 log 库链接到你的库
target_link_libraries(native-lib ${log-lib})

注释解释:

  • cmake_minimum_required: 指定 CMake 的最低版本要求。
  • add_library: 定义一个名为 native-lib 的共享库,并指定其源文件。
  • find_library: 查找 Android 的日志库 log
  • target_link_libraries: 将查找到的日志库链接到 native-lib

app 模块的 build.gradle 中配置 CMake:

android {
    ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    ...
}

注释解释:

  • externalNativeBuild:配置原生构建工具,这里使用 CMake。
  • path: 指定 CMakeLists.txt 文件的位置。

4. 编写 C/C++ 代码

app/src/main/cpp 目录下创建一个名为 native-lib.cpp 的文件,并添加以下代码:

#include <jni.h>
#include <string>

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

注释解释:

  • JNIEXPORTJNICALL: 定义 JNI 函数的相关宏。
  • Java_com_example_myapp_MainActivity_stringFromJNI: JNI 函数名称,需遵循特定命名规则。
  • env: 指向 JNI 环境的指针。
  • NewStringUTF: 用于返回一个新的 Java 字符串对象。

5. 写 Java 接口

在你的主活动 MainActivity.java 中,添加以下代码:

public class MainActivity extends AppCompatActivity {
    // 加载库
    static {
        System.loadLibrary("native-lib");
    }

    // 声明本地方法
    public native String stringFromJNI();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 使用本地方法
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }
}

注释解释:

  • System.loadLibrary: 加载 NDK 编译的库。
  • public native String stringFromJNI: 声明本地方法,供 Java 调用。
  • onCreate 方法中调用本地方法,并将返回的字符串设置到 TextView

6. 构建项目

在 Android Studio 中点击 Build > Rebuild Project,这将会编译你的 C/C++ 代码并生成对应的库。

7. 测试库

通过模拟器或真实设备运行项目,确保在 UI 上显示的文本是 "Hello from C++"。

以下是全流程的旅行图,帮助你更好理解:

journey
    title 使用 Android NDK 编译库
    section 准备工作
      安装 NDK: 5: 成功
    section 创建项目
      创建 Android 项目: 5: 成功
    section 配置 CMake
      创建 CMakeLists.txt: 5: 成功
    section 编写代码
      编写 C/C++ 代码: 5: 成功
      编写 Java 接口: 5: 成功
    section 构建与测试
      构建项目: 5: 成功
      测试库: 5: 成功

结尾

通过本教程,你已经学习了如何使用 Android NDK 编译库,从安装 NDK 到创建 CMake 配置,再到编写 C/C++ 代码和 Java 接口。随着你对 NDK 的深入了解,能够将更多复杂的功能集成到你的 Android 应用中。不要停下探索的脚步,继续发掘 NDK 的潜力,构建更高效的应用吧!如果在实施过程中遇到问题,可以随时查阅相关文档或寻求社区的帮助。祝你编程愉快!