项目指南:在 Android 9 中使用 NDK

Android NDK(Native Development Kit)是一套工具,使用它可以将部分代码用 C/C++ 编写,以提高性能或重用已有的代码。对于刚入门的开发者来说,了解如何在 Android 9 中使用 NDK 是至关重要的。本文将帮助你理解整个流程,包括选择合适的 NDK 版本并在 Android Studio 中配置它。

整体流程

下面是实现“在 Android 9 中使用 NDK”的流程,简单明了,可以帮助你更好地理解步骤。

步骤 描述
1 确认 Android 9 的 SDK 版本
2 下载相应的 NDK 版本
3 在 Android Studio 中配置 NDK
4 创建并编写 C/C++ 代码
5 设置 CMake 文件
6 构建项目并运行
7 调试原生代码

详细步骤

步骤 1: 确认 Android 9 的 SDK 版本

首先,你需要确认你的 Android SDK 是否支持 Android 9(API 28)。你可以在 Android Studio 的 SDK 管理器中查看。

打开 File -> Settings (在 Mac 上是 Android Studio -> Preferences),然后在左侧选择 Appearance & Behavior -> System Settings -> Android SDK。在 SDK Platforms 标签页下,确保 "Android 9.0 (Pie)" 被选中。

步骤 2: 下载相应的 NDK 版本

你可以从 [Android NDK Releases]( 页面下载 NDK。对于 SDK 28,建议使用支持 Android 9 的 NDK 版本,如 r19c 或更高版本。可以通过 SDK Manager 下载 NDK,路径为 SDK Tools 下选择 NDK。

步骤 3: 在 Android Studio 中配置 NDK

配置 NDK 需要在 build.gradle 文件中添加相关配置。以下是相关代码:

android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11" // 使用 C++11 标准
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt" // 指定 CMake 文件路径
        }
    }
}
  • externalNativeBuild 块中指定 CMake 生成本地代码的方式。

步骤 4: 创建并编写 C/C++ 代码

创建一个文件夹,通常命名为 jnicpp,用于存放 C/C++ 代码。在此文件夹中创建示例 C++ 文件native-lib.cpp

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

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()); // 将 C++ 字符串转换为 JNI 字符串
}
  • 这个函数从 JNI 调用,并返回一个字符串。

步骤 5: 设置 CMake 文件

创建 CMakeLists.txt 文件并添加以下内容:

cmake_minimum_required(VERSION 3.4.1) // 指定最小的 CMake 版本

add_library( // 创建库
        mylib // 库名
        SHARED // 共享库
        native-lib.cpp) // 源文件

find_library( // 查找 Android 日志库
        log-lib
        log)

target_link_libraries( // 链接库
        mylib
        ${log-lib}) // 日志库
  • 在 CMake 文件中配置库名称和源文件路径。

步骤 6: 构建项目并运行

在 Android Studio 中,点击“Build”按钮,然后选择“Rebuild Project”。构建完成后运行应用程序。在 MainActivity.java 中加载本地库并调用本地方法:

public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("mylib"); // 加载名为 mylib 的本地库
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = findViewById(R.id.sample_text);
        textView.setText(stringFromJNI()); // 调用本地方法
    }

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

步骤 7: 调试原生代码

要调试原生代码,确保在 CMakeLists.txt 文件中启用调试信息。可以通过在 cppFlags 中添加 -g-DDEBUG 来实现:

cppFlags "-std=c++11 -g -DDEBUG" // 启用调试信息

关系图

为了直观了解项目结构,使用 ER 图表示 Android 项目与 C++ 文件的关系。如下所示:

erDiagram
    PROJECT {
        string application
        string java_code
        string native_lib
    }
    
    PROJECT ||--o{ native_lib : uses
    native_lib ||--o{ java_code : calls

流程图

下面是工作流程的图示表示,帮助更好地理解步骤之间的关系。

flowchart TD
    A[确认 Android 9 的 SDK 版本] --> B[下载相应的 NDK 版本];
    B --> C[在 Android Studio 中配置 NDK];
    C --> D[创建并编写 C/C++ 代码];
    D --> E[设置 CMake 文件];
    E --> F[构建项目并运行];
    F --> G[调试原生代码];

结尾

在 Android 9 中使用 NDK 的流程是相对简单的,但对新手开发者来说需要一定的学习和实践。掌握了上述步骤后,你将能够编写高效的原生代码,并将其集成到 Android 应用中。这一技能的掌握不仅能提升你的开发能力,还能帮助你在 Android 开发的旅程中迈出坚实的一步。不断实践与探索,期待你在未来的项目中取得更好的成绩!