首页 > 其他分享 >Android NDK使用指南(基础篇)

Android NDK使用指南(基础篇)

时间:2024-05-28 14:33:13浏览次数:21  
标签:NDK Java C++ env JNI 使用指南 Android

引言

在 Android 开发中,大多数应用程序都是用 Java 或 Kotlin 编写的。然而,有时候我们需要使用 C 或 C++ 代码来提高性能,或者为了与现有的 C/C++ 库集成。Android NDK就是为此目的而设计的工具包。本文将介绍Android NDK的相关基本概念和基础使用方法,帮助读者初步理解NDK。有关NDK的原理及更高级的使用技巧将在后续的进阶篇中进行介绍(咕咕咕)。

什么是 Android NDK?

Android NDK 是一个工具集,允许开发者在 Android 应用中使用 C 和 C++ 代码。通过 NDK,可以:

  • 实现高性能的计算任务,如游戏引擎、图像处理等。
  • 重用现有的 C/C++ 库,提高开发效率。
  • 在某些情况下,通过优化和使用更底层的语言来提升应用性能。

NDK 基础概念

  • NDK (Native Development Kit)

NDK 是 Android 提供的一套工具集,允许在 Android 应用中使用本地代码(C/C++)。NDK 提供了与系统 API 交互的功能,使开发者能够编写更高效的代码、访问底层硬件、以及使用现有的 C/C++ 库。

  • JNI(Java Native Interface)

JNI 是 Java 平台的一部分,用于实现 Java 代码与本地(Native)代码之间的互操作。通过 JNI,Java 方法可以调用 C/C++ 函数,反之亦然。JNI 是 NDK 编程的核心,理解 JNI 是掌握 NDK 编程的关键。

JNI 编程详解

1. 基本数据类型映射

Java类型Native类型符号
booleanjbooleanZ
bytejbyteB
charjcharC
shortjshortS
intjintI
longjlongJ
floatjfloatF
doublejdoubleD
voidvoidV
StringjstringLjava/lang/String;
ObjectjobjectL+包名/类名+$嵌套类+;
数组数组+Array[基本类型符号

注:若Java类型为数组,则对应Native类型为基本类型+Array,打个比方说明,
Java类型为byte[],则Native类型为jbyteArray,符号为[B

2. JNI 函数定义与实现

下面以两个demo简单说明Java调用C++和C++调用Java的基本步骤:

  • Java调用C/C++代码流程
// Java层定义
public class NativeLib {
    static {
        System.loadLibrary("native-lib");
    }
    public native String stringFromJNI();
}
// 对应的C/C++实现
#include <jni.h>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapp_NativeLib_stringFromJNI(JNIEnv* env, jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
  • C/C++调用Java代码流程
// Java层实现
public class NativeLib {
    public String getMessageFromJava() {
        return "Hello from Java";
    }
}
// C/C++层定义
#include <jni.h>
JavaVM* g_javaVM = nullptr;​
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
    if (jvm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }
    // Java 虚拟机实例的全局引用
    g_javaVM = jvm;
    return JNI_VERSION_1_6;
}
​
std::string callJavaMethod() {
    JNIEnv* env = nullptr;
    // 将本地线程附加到Java虚拟机
    g_javaVM->AttachCurrentThread(&env, nullptr);
    // 查找 Java 类
    jclass clazz = env->FindClass("com/example/myapp/NativeLib");
    // 查找构造方法 ID
    jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V");
    // 创建 Java 类的实例
    jobject instance = env->NewObject(clazz, constructor);
    // 查找实例方法 ID
    jmethodID methodID = env->GetMethodID(clazz, "getMessageFromJava", "()Ljava/lang/String;");
    // 调用实例方法
    std::string message = env->CallObjectMethod(instance, methodID);
    // 将本地线程与 Java 虚拟机分离
    g_javaVM->DetachCurrentThread();
    return message;
}

标签:NDK,Java,C++,env,JNI,使用指南,Android
From: https://blog.csdn.net/weixin_46056189/article/details/139238645

相关文章

  • Android Media Framework - 开篇
    前言AndroidMedia是一块非常庞大的内容,上到APP的书写,中到播放器的实现、封装格式的了解,下到编解码组件的封装、VPUAPI的了解,每块内容的学习都需要我们下很大的功夫。此外,我们还要对相关的模块进行了解,比如AudioFlinger、SurfaceFlinger等,他们与Media相关交织共同构建了Android......
  • Android gradle 配置阿里镜像
    1.打开项目中的build.gradle文件。2.在build.gradle文件中添加阿里镜像的地址,如下所示:buildscript{repositories{maven{url'https://maven.aliyun.com/repository/public'}maven{url'https://maven.aliyun.com/repository/central'}......
  • 升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0 uniapp、vue、android、web 框
    升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0uniapp、vue、android、web框架:Vue3+SpringBoot3),界面功能(一)  升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0uniapp、vue、android、web框架:Vue3+SpringBoot3),界面功能(一) 1.登录与申请试用界......
  • android studio2024最新详解(完全小白)安装-运行第一个程序
    前面我用2023最新版本的,死活就卡在引入依赖那里卡了两天,俺的崩溃谁知啊!! 后面我就换了个思维,看着网上大多的教程都是基于2022或者2020的,我就找了个看起来非常详细的视频,里面的是2020的,所以我就下载了2020。  有点小伙伴可能会找不到androidstudio的过往版本,这里我就直......
  • 如何使用ADB shell设置Android设备的全局HTTP代理
    打开ADB调试这里使用蓝叠模拟器进行测试下载adbhttps://dl.google.com/android/repository/platform-tools-latest-windows.zip解压好,放哪都行在platform-tools目录下,右击空白处,选择“在终端中打开”开始操作建立连接.\adbconnectlocalhost:5555启动shell会话......
  • Android Toast弹出消息在指定位置(setGravity)
    importandroid.widget.Toastimportandroid.view.Gravity默认Toast是显示在底部的,可以通过以下方法让其显示在顶部正中Toasttoast=Toast.makeText(SearchActivity.this,"取消关注失败",Toast.LENGTH_SHORT);toast.setGravity(Gravity.CENTER,0,0);toast.show();这样......
  • Nginx 配置文件使用指南
    Nginx的配置文件是对其进行各种设置和功能定义的关键。一、配置文件结构一般主要包括全局块、事件块和HTTP块等。二、全局块user:指定运行Nginx进程的用户和组。worker_processes:设置工作进程数量。三、事件块accept_mutex:决定连接处理方式。四、HTTP块server ......
  • android studio 实现web网站变成app小程序
    MainActivity.javapackagecom.example.myapplication;importandroid.os.Bundle;importandroid.webkit.WebView;importandroid.webkit.WebViewClient;importandroidx.appcompat.app.AppCompatActivity;publicclassMainActivityextendsAppCompatActivity{......
  • Android 深入系统源码探讨 Activity、Window 和 View 的关系与实践
    文章目录1、概括2、AndroidWindow设计2.1、Window类2.2、PhoneWindow2.3、WindowManager2.4、ViewRootImpl2.5、DecorView3、AndroidActivity设计3.1、Activity的基本概念3.2.、Activity的生命周期3.3、Activity的内部结构4、AndroidView设计4.1、View的基本概......
  • Android Log.isLoggable 控制log打印
    DEBUG方法比较当我们在做APP开发时,需要设置调试开关打印Log,下面我列举出3种方法:方法一:直接赋值publicstaticfinalbooleanDEBUG=true;//false方法二:设置BuildConfig.DEBUG的值publicstaticfinalbooleanDEBUG=BuildConfig.DEBUG;方法三:设置Log.isLoggable的值publics......