Android NDK开发详细介绍

Android NDK(Native Development Kit)是 Android 应用程序接口(API)提供的一组原生开发工具。它提供了使用 C 或 C++ 语言编写 Android 应用程序所需的所有工具,其中包括头文件、库函数和 debug 工具等,方便开发者快速开发高效的 Android

Android NDK开发详细介绍

什么是Android NDK

Android NDK(Native Development Kit)是 Android 应用程序接口(API)提供的一组原生开发工具。它提供了使用 C 或 C++ 语言编写 Android 应用程序所需的所有工具,其中包括头文件、库函数和 debug 工具等,方便开发者快速开发高效的 Android 应用程序。NDK开发对于需要高效率、耗费大量CPU资源的应用程序来说尤其重要,例如高性能的3D游戏引擎等。

NDK开发步骤

NDK开发主要分为以下几步骤:

  1. 安装并配置NDK环境

在 Android Studio 中使用 NDK 开发需要先安装 NDK 工具,并且需要在项目中配置环境变量和 NDK 路径信息。可以通过 File -> Settings -> Android SDK -> SDK Tools -> NDK 安装到本地,然后在项目的gradle.properties中设置ndk.dir属性。

  1. 创建 Android Studio 项目

创建Android Studio 项目的方式和普通的 Android 项目创建方式基本相同。在创建完毕后,需要配置项目的 build.gradle 文件,在配置过程中需要为 NDK 配置一些基本编译信息。

  1. 编写 native 代码

在 app 模块 src 目录下新建 jni 目录,并创建一个.cpp 文件。在此文件中定义 C/C++ 代码,并使用 JNI 命令为其提供 Java 接口。

  1. 编写 JNI 接口

在 Java 模块中定义 JNI 类,并在该类的 native 方法中调用 C/C++ 代码实现相关功能。

  1. 使用 ndk-build 编译ndk代码

在工程根目录下创建 Android.mk 和 Application.mk 配置文件,然后使用 ndk-build 工具编译 ndk 代码。

一个简单的示例

下面用一个简单的示例来说明NDK开发的过程。我们要编写一个JNI方法,输入两个整数,输出二者之和。整个过程可以分为以下步骤:

步骤一:配置NDK环境

在Android Studio中,我们可以通过 SDK Manager 安装 NDK 相关工具,然后通过编辑项目的 build.gradle 文件配置 NDK 环境。具体配置方法如下:

在 build.gradle 文件中配置 NDK 环境

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "com.example.ndkdemo"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        // 应用程序ABI支持的架构
        ndk {
            // 设置支持的架构,armeabi-v7a支持中文语言
            abiFilters 'armeabi-v7a'
        }

        // 告诉android工具链到哪里找到NDK
        externalNativeBuild {
            ndkBuild {
                path 'src/main/jni/Android.mk'
            }
        }
    }
} 

// 将NDK版本指定为r16b
//建议使用NDK16及以上版本
//建议将NDK路径配置到环境变量中
//若未配置在系统上手动安装NDK,并在Android Studio中指定 NDK路径
//此处配置到gradle.properties文件中
//ndk.dir指向SDK中的NDK包的路径
//也可以直接将ndk的解压文件拷贝到项目中,通过build.gradle来指定
ndkVersion=21.0.6113669
android.useDeprecatedNdk=true

//ndk.dir指向SDK中的NDK包的路径
//如果在build.gradle文件中已经指定,在此不用再次指定
//ndk.dir=[ndk的解压路径];

步骤二:创建 Android Studio 项目

创建 Android Studio 项目的方式和普通的 Android 项目创建方式相同。创建完毕后,在项目的 build.gradle 文件中配置 NDK 编译信息。

步骤三:编写 native 代码

在 app 模块 src 目录下新建 jni 目录,并创建一个.cpp 文件。在此文件中定义 C/C++ 代码,并使用 JNI 命令为其提供 Java 接口。

我们通过创建名为 "add.cpp"的文件来完成这一步。代码如下:

#include <jni.h>

extern "C"
JNIEXPORT jint JNICALL
Java_com_example_ndkdemo_AddNum_add(JNIEnv *env, jobject thiz, jint num1, jint num2) {
    return num1 + num2;
}

步骤四:编写 JNI 接口

在 Java 模块中定义 JNI 类,并在该类的 native 方法中调用 C/C++ 代码实现相关功能。

我们通过创建名为 "AddNum.java"的文件来完成这一步。代码如下:

package com.example.ndkdemo;

public class AddNum {
    public native int add(int num1, int num2);

    static {
        System.loadLibrary("add");
    }
}

步骤五:使用 ndk-build 编译ndk代码

在工程根目录下创建 Android.mk 和 Application.mk 配置文件,然后使用 ndk-build 工具编译 ndk 代码。

下面是 Android.mk 和 Application.mk 配置文件的具体内容:

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := add
LOCAL_SRC_FILES := add.cpp

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_ABI := armeabi-v7a
APP_PLATFORM := android-21

在修改完配置文件后,可以通过命令行执行 ndk-build 命令进行编译:

ndk-build

以上过程完成后,在MainActivity中调用add方法即可实现上述需求,具体代码如下:

package com.example.ndkdemo;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("add");
    }

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

        AddNum addNum = new AddNum();
        int res = addNum.add(10, 20);
        TextView textView = findViewById(R.id.text_view);
        textView.setText("10 + 20 = " + res);
    }
}

以上就是一个简单的NDK开发流程,具体的项目会更加复杂实用。

本文标题为:Android NDK开发详细介绍

基础教程推荐