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开发主要分为以下几步骤:
- 安装并配置NDK环境
在 Android Studio 中使用 NDK 开发需要先安装 NDK 工具,并且需要在项目中配置环境变量和 NDK 路径信息。可以通过 File -> Settings -> Android SDK -> SDK Tools -> NDK 安装到本地,然后在项目的gradle.properties中设置ndk.dir属性。
- 创建 Android Studio 项目
创建Android Studio 项目的方式和普通的 Android 项目创建方式基本相同。在创建完毕后,需要配置项目的 build.gradle 文件,在配置过程中需要为 NDK 配置一些基本编译信息。
- 编写 native 代码
在 app 模块 src 目录下新建 jni 目录,并创建一个.cpp 文件。在此文件中定义 C/C++ 代码,并使用 JNI 命令为其提供 Java 接口。
- 编写 JNI 接口
在 Java 模块中定义 JNI 类,并在该类的 native 方法中调用 C/C++ 代码实现相关功能。
- 使用 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开发详细介绍
基础教程推荐
- ProtoStuff不支持BigDecimal序列化及反序列化详解 2023-04-23
- mybatis配置mapper-locations的坑及解决 2022-12-07
- Java使用POI导出Excel(一):单sheet 2023-06-06
- Java spring-data-mongo、shell 命令行获取 ( 2.x 升级到 3.x ) mongo db的运行状态的实践 2023-09-01
- js表达式计算器代码 2024-01-11
- 关于Jar包部署命令全面解析 2023-06-30
- Java+Ajax实现的用户名重复检验功能实例详解 2024-02-26
- 关于同一个service调用service本身的方法 2023-01-24
- Java多线程并发FutureTask使用详解 2023-02-05
- Spring框架中 @Autowired 和 @Resource 注解的区别 2023-08-01