Android JNI代码语法解释

news2025/6/23 7:05:27

文章目录

  • JNI中的JNIEXPORT、JNIIMPORT和JNICALL
  • JVM如何查找native方法
    • ①按照JNI规范的命名规则
    • ②调用JNI提供的RegsterNatives函数,将本地函数注册到JVM中
    • 示例代码
  • JNI数据类型
  • JNI字符串的处理
    • ①获取字符串
    • ②释放字符串
    • ③创建字符串
    • ④其他字符串处理API

JNI中的JNIEXPORT、JNIIMPORT和JNICALL

两个关键字的定义都可以在jni_md.h下找到

均用于定义与平台相关的宏

用于标识函数用途

  • JNIEXPORT:(实则为C++规则)放置在函数、变量或对象的声明前面,指示编译器将其导出为动态链接库的一部分。这使得其他程序可以通过在运行时加载动态链接库并使用导出的函数、变量或对象
  • JNIIMPORT:(实则为C++规则)放置在函数、变量或对象的声明前面,指示编译器将其标记为从动态链接库中导入的符号
  • JNICALL:(实则为C++规则)一种标准的函数调用约定,也被称为 “标准调用”;具有以下性质:
    函数的参数按照从右到左的顺序依次入栈。这意味着最右边的参数首先被压入栈中。
    调用方清理栈上的参数。这意味着在函数调用结束后,由调用方负责从栈上移除函数的参数。
    函数的返回值通常存储在 EAX 寄存器中
//Windows下的定义
#define JNIEXPORT __declspec(dllexport)
#define JNIIMPORT __declspec(dllimport)
#define JNICALL __stacall

//Linux下的定义(实际是空定义)
#define JNIEXPORT
#define JNIIMPORT
#define JNICALL

JVM如何查找native方法

①按照JNI规范的命名规则

即根据JNI所约定的命名规则来指定函数的命名,具体规则如下:Java_类全路径_方法名

JNIEXPORT jstring JNICALL Java_com_kqli_jni_JniTest_getStringFromC(JNIEnv *env, jclass jclass);
JNIEXPORT jstring JNICALL Jave_com_test_jni_HelloWord_func(JNIEnv* env, jclass class, jstring str);
  • 第一个jstring为返回值(string类型)
  • 函数名中com_kqli_jni_JniTest_getStringFromC,代表Java类com_kqli_jni_JniTest,getStringFromC代表具体的函数名称
    JNIEnv,指向JVM函数表的指针
  • jclass,调用Java中native方法的实例对象

②调用JNI提供的RegsterNatives函数,将本地函数注册到JVM中

//函数原型
jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);
  • clazz:声明native方法的类
  • methods:JNINativeMethod结构的数组
typedef struct {
    char *name;	//java方法名称
    char *signature;//java方法签名
    void *fnPtr;//c/c++的函数指针
} JNINativeMethod;
  • nMethods:指定methods数组中的本地方法数,通常写法为
nMethods = sizeof(methods) / sizeof(JNINativeMethod);

示例代码

java

package com.test.jni;

public class A{
	static{
		System.loadLibrary("A");	
	}
	
	public static native int a(String str);
	public static native boolean b();
	public static native int c(Object obj);
	
	public static void main(String[] args){
		......
	}
}

native

jint a(JNIEnv *env ,jclass class, jstring str){
   ....
}

jboolean b(JNIEnv *env ,jclass class){
   ....
}

jint c(JNIEnv *env ,jclass class, jobject obj){
   ....
}

static JNINativeMethod method_table[] = 
{
	{"a", "(Ljava/lang/String;)I", (void *)a},
	{"b", "()Z", (void *)b},
	{"c", "(Ljava/lang/Object;)I", (void *)c},
};

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    ......
    jclass clz = env ->FindClass(JNIREG_CLASS);
    env ->RegisterNatives(clz, method_table, sizeof(method_table) / sizeof(JNINativeMethod));
    ......
}

JNI数据类型

在这里插入图片描述

类: 例如String的签名为Ljava/lang/String; 注意: 包名和类名用/隔开, 结尾有一个;
数组:用[表示数组签名, 例如int[]的签名为[I

JNI字符串的处理

①获取字符串

JNI通过jstring来处理字符串数据,但是jstring是指向JVM内部的字符串,和C风格的字符串类型char * 不同,因此必须使用合适的JNI函数来访问JVM内部的字符串。
因为Java默认使用unicode编码,而C/C++默认使用UTF编码,所以要注意进行编码转换。

const char* GetStringUTFChars(jstring str, jbbolean *isCopy);
  • str为需要获取的字符串
  • isCopy取值JNI_TRUE和JNI_FALSE,一般填NULL即可
  • JNI_TRUE:返回JVM内部源字符串的拷贝,并为新产生的字符串分配内存空间
  • JNI_FALSE:返回JVM内部源字符串的指针,并可以指针修改源字符串的内容

②释放字符串

通过GetStringUTFChars获取到字符串并返回的为源字符串拷贝后,在使用完毕要记得释放内存。

void ReleaseStringUTFChars(jstring str, const char* utf);
  • str为需要释放的字符串指针
  • utf为字节编码

③创建字符串

jstring NewStringUTF(const char * bytes);
  • bytes为C/C++的字符串数据源

④其他字符串处理API

  • GetStringChars、ReleaseStringChars:用于获取/释放Unicode格式的字符串
  • GetStringUTFLength、GetStringLength:用于获取UTF-8/Unicode格式的字符串长度
  • GetStringCritical、ReleaseStringCritical:用于直接返回/释放源字符串的指针,获取这个指针会导致暂停GC线程,如果GC线程暂停时又被其他线程触发GC的话,会出现系统死锁的阻塞调用
  • GetStringUTFRegion、GetStringRegion:用于获取UTF-8/Unicode格式字符指定范围内的内容,并会将源字符串复制到一个预先分配的缓冲区内

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1086301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云李腾飞:基于ECS倚天实例的大数据加速最佳实践

云布道师 为了更好地方便各位开发者和用户了解并应用 ECS 倚天实例,由阿里云弹性计算联合基础软件团队 & 平头哥 & 安谋科技(arm),共同发起了【倚天实例迁移课程】,本系列课程共计 10 节课程,共分为…

C++学习day6

1.思维导图 2.作业: 编程题: 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象…

云原生Kubernetes:K8S集群版本升级(v1.20.6 - v1.20.15)

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验 1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 一、理论 1.K8S集群升级 (1)概念 搭建K8S集群的方式有很多种,比如二进制,kubeadm…

Outlook导入导出功能灰色,怎么解决

下载安装 Outlook 软件后,登陆账号,然后选择“文件” - “导出”,结果发现“导出”按钮是灰色的,根本无法导出。根据官方说法:由于配置没有完成或者office产品没有正确激活。outlook导出键为灰色原因由于配置没有完成或…

第五篇Android--EditText详解

EditText 字面意思可以编辑的文本。在Android中就是用来接收用户输入的输入框。 1.基本用法 <EditTextandroid:id"id/id_phone_edit"android:layout_width"match_parent"android:layout_height"48dp"android:background"android:color/…

大数据精准营销是从几个维度帮您去筛选准客户?

人工智能和大数据精准营销的存在则可以准确捕捉到消费者最近的心理活动预期&#xff0c;可以根据消费者心理活动准确告诉他&#xff0c;他需要的信息在哪里。由于每个人看到的效果不同&#xff0c;消费者会感觉广告是为他量身打造的。这也就是我们所说的精准营销。 而精准营销…

Elasticsearch 和 Arduino:一起变得更好!

作者&#xff1a;Enrico Zimuel 使用 Arduino IoT 设备与 Elasticsearch 和 Elastic Cloud 进行通信的简单方法 在 Elastic&#xff0c;我们不断寻找简化搜索体验的新方法&#xff0c;并开始关注物联网世界。 来自物联网的数据收集可能非常具有挑战性&#xff0c;尤其是当我们…

【面试经典150 | 哈希表】字母异位词分组

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;排序哈希表方法二&#xff1a;数组作为哈希表的键方法三&#xff1a;字符串作为哈希表的键知识回顾accumulate 写在最后 Tag 【自定义哈希】【哈希表】【数组】 题目来源 49. 字母异位词分组 题目解读 将字符串数组中…

面试全攻略:ElasticSearch分页与MySQL分页的底层逻辑与优化技巧

大家好&#xff0c;我是小米&#xff01;今天&#xff0c;我要和大家一起深入探讨一个在技术面试中经常被问到的问题&#xff1a;ElasticSearch中的分页与MySQL中的分页有什么区别&#xff1f;分页是数据库查询中非常常见的操作&#xff0c;但当我们在不同的数据库中执行分页操…

画面清晰如真:OLED透明拼接屏在金华市的画质表现

金华市位于中国浙江省中西部&#xff0c;是中国重要的历史文化名城之一。 金华市拥有悠久的历史和丰富的文化遗产&#xff0c;如古城墙、古建筑和古镇等。 这为OLED透明拼接屏技术的应用提供了丰富的创作素材和展示主题。 金华市的著名景点 义乌国际商贸城&#xff1a;义乌国…

如何开发一款跑酷游戏?

跑酷游戏&#xff08;Parkour Game&#xff09;是一种流行的视频游戏类型&#xff0c;玩家需要在游戏中控制角色进行极限动作、跳跃、爬墙和各种动作&#xff0c;以完成各种挑战和任务。如果你有兴趣开发一款跑酷游戏&#xff0c;以下是一些关键步骤和考虑事项&#xff1a; 游…

职场新人:大公司还是小公司,何去何从?

导言&#xff1a; 对于职场新人来说&#xff0c;选择进入大公司还是小公司是一个重要的决策。大公司通常具有知名度、资源丰富和完善的职业发展路径&#xff0c;而小公司则更加灵活、创新和有机会获得更多的责任。本文将探讨大公司和小公司的优势&#xff0c;并给出一些建议&am…

MySQL下载和安装详细步骤

下载步骤详解 本教程以 MySQL 5.7.29 为例介绍其在 Windows 10 操作系统下的安装和配置过程。 步骤 1)&#xff1a;打开 MySQL 官方网站&#xff08;http://www.mysql.com&#xff09; 步骤 2)&#xff1a;滑到网页底部&#xff0c;点击 DOWNLOADS 列表下的 MySQL Community…

基于SpringBoot的教学辅助平台

目录 前言 一、技术栈 二、系统功能介绍 学生信息管理 教师信息管理 课程信息管理 科目分类管理 班级分类管理 课程作业管理 交流论坛管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理…

一步步教你如何搭建家政小程序+家政管理系统

在当今数字化时代&#xff0c;家政服务行业也需要紧跟潮流&#xff0c;借助互联网技术提升服务品质和效率。而小程序作为一种轻量级应用&#xff0c;能够帮助家政服务公司在推广、预约、评价等方面实现便捷操作&#xff0c;吸引更多客户。本文将介绍如何轻松搭建家政服务行业的…

那些年你不一定会的磁盘、目录、文件操作(c语言版)

一、前言 今天和大家分享的是使用win32api操作磁盘&#xff0c;目录&#xff0c;文件&#xff0c;这里分为三大块&#xff0c;希望能帮到大家。在讲之前还是先给大家看看效果图&#xff0c;如下图&#xff1a; 二、磁盘 获取盘符下的所有文件夹.rar: https://url18.ctfile.co…

H3C交换机的40G堆叠线 ,可以插在普通光口做堆叠吗?

环境&#xff1a; S6520X-24ST-SI交换机 H3C LSWM1QSTK2万兆40G堆叠线QSFP 问题描述&#xff1a; H3C交换机的40G堆叠线 &#xff0c;可以插在普通光口做堆叠吗&#xff1f; 解答&#xff1a; 1.H3C交换机的40G堆叠线通常是用于连接堆叠模块或堆叠端口的。这些堆叠线通常使…

小谈设计模式(25)—职责链模式

小谈设计模式&#xff08;25&#xff09;—职责链模式 专栏介绍专栏地址专栏介绍 职责链模式分析角色分析抽象处理者&#xff08;Handler&#xff09;具体处理者&#xff08;ConcreteHandler&#xff09;客户端&#xff08;Client&#xff09; 优缺点分析优点123 缺点12 应用场…

Flink on k8s容器日志生成原理及与Yarn部署时的日志生成模式对比

Flink on k8s部署日志详解及与Yarn部署时的日志生成模式对比 最近需要将flink由原先部署到Yarn集群切换到kubernetes集群&#xff0c;在切换之后需要熟悉flink on k8s的运行模式。在使用过程中针对日志模块发现&#xff0c;在k8s的容器中&#xff0c;flink的系统日志只有jobma…

【yolov5】改进系列——特征图可视化

文章目录 前言一、特征图可视化二、可视化指定层三、合并通道可视化总结 前言 对于特征图可视化感兴趣可以参考我的另一篇记录&#xff1a;六行代码实现&#xff1a;特征图提取与特征图可视化&#xff0c;可以实现分类网络的特征图可视化 最近忙论文&#xff0c;想在yolov5上…