Android NDK开发(二)——JNIEnv、jobject与jclass关系

2024-05-10 03:36

本文主要是介绍Android NDK开发(二)——JNIEnv、jobject与jclass关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要讲解Android NDK开发中JNIEnv、jobject与jclass的相关知识,并用c和c++两种语言实现了jobject和jclass。


本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统学习,梳理总结后写下文章,对音视频相关内容感兴趣的读者,可以点击观看课程网址:零声教育


Android NDK开发(二)——JNIEnv、jobject与jclass关系

  • JNIEnv、jobject与jclass关系
  • jobject和jclass实现
  • 利用c语言实现

JNIEnv、jobject与jclass关系

JavaVM 和 Env 的关系

  1. JavaVm是虚拟机在jni层的代表,⼀个进程只有⼀个JavaVm,所有线程共⽤⼀个JavaVM。
  2. JNIEnv 是⼀个线程相关的结构体,它代表了java的运⾏环境 。每⼀个线程都会有⼀个,不同的线程中
    不能相互调⽤,每个JNIEnv都是线程专有的。 jni中可以拥有很多个JNIEnv,可以使⽤它来进⾏java层
    和native层的调⽤。
  3. JNIEnv 是⼀个指针,指向⼀个线程相关的结构,线程相关结构指向了JNI函数指针数组。这个数组⾥⾯
    定义了⼤量的JNI函数指针。
  4. 在同⼀个线程中,多次调⽤JNI层⽅法,传⼊的JNIEnv都是相同的。
  5. 在java层定义的本地⽅法,可以在不同的线程中调⽤,因此是可以接受不同的JNIEnv。

jobject和jclass区别:
jobject:实例引⽤(C++的说法:对象引⽤)(普通函数)
jclass: 类引⽤ (静态函数)

jobject和jclass实现

创建一个新项目,
java->com.example.ndk4_3->MainActivity文件中,添加声明

static public native String staticstringFromJNI();

在这里插入图片描述
之后利用java.h自动生成JNI接口
在这里插入图片描述
自动生成接口:
在这里插入图片描述
修改cpp->native-lib.cpp

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_ndk4_13_MainActivity_staticstringFromJNI(JNIEnv *env,jclass){std::string hello = "Static Hello from C++";return env->NewStringUTF(hello.c_str());
}

此时调用的,普通函数就是jobject,静态函数就是jclass,与c++中类似,静态函数是属于整个类的,而普通函数属于每个对象的。
在这里插入图片描述
之后,修改对应文件,运行程序。
修改res->layout->activity_main.xml文件,设置布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/sample_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="50dp"android:text="Hello World!"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/sample_text2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="100dp"android:text="Hello World!"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

布局预览如下:
在这里插入图片描述
修改java->com.example.ndk4_3->MainActivity文件

	TextView tv2 = findViewById(R.id.sample_text2);tv2.setText(staticstringFromJNI());

在这里插入图片描述
之后运行即可:
在这里插入图片描述

利用c语言实现

cpp->includes->CMaketList.txt中的native-lib.cpp修改为native-lib.c
在这里插入图片描述
新建一个native-lib.c如下

#include <jni.h>JNIEXPORT jstring JNICALL
Java_com_example_ndk4_13_MainActivity_stringFromJNI(JNIEnv *env,jobject obj/* this */) {char str[] = "Hello from C";return (*env)->NewStringUTF(env, str);
}
JNIEXPORT jstring JNICALL
Java_com_example_ndk4_13_MainActivity_staticstringFromJNI(JNIEnv *env,jclass jcs){char str[] = "Static Hello from C";return (*env)->NewStringUTF(env, str);
}

运行:
在这里插入图片描述

这篇关于Android NDK开发(二)——JNIEnv、jobject与jclass关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975326

相关文章

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio