JNI方案说明和使用方法介绍

JNI简介

JNI(Java Native Interface)是Java编程语言中用于实现Java代码与本地(Native)代码(通常是C或C++代码)交互的机制。它允许Java应用程序调用本地代码中的功能,也可以让本地代码调用Java类和方法。JNI在Java平台上实现了Java与其他编程语言的互操作性。(即可互相调用)


主要目的和用途:

  • 访问本地功能: JNI允许Java程序通过调用本地代码来访问底层系统功能、硬件功能或第三方库,这些本地代码通常用C或C++编写。
  • 性能优化: 有时候,一些计算密集型任务在本地代码中执行可能比在Java中更高效。通过JNI,你可以将这些任务放在本地代码中,以提高性能。
  • 平台特定功能: JNI允许Java程序在需要平台特定功能的情况下,通过本地代码调用这些功能,以适应不同的操作系统和硬件环境。
  • 复用现有代码: 如果已经存在C/C++代码库,可以通过JNI将这些库集成到Java应用程序中,而无需重新实现相同的功能。



基本流程:

  • 编写本地代码: 首先,你需要编写C/C++代码实现要调用的功能。
  • 生成动态库: 将C/C++代码编译成动态链接库(.dll或.so文件),供Java代码调用。
  • Java接口定义: 在Java中,你需要编写一个与本地代码对应的JNI接口,这样Java代码就能够调用本地功能。
  • 加载本地库: 在Java代码中使用System.loadLibrary("libraryName")加载本地库。
  • 调用本地功能: 通过JNI接口调用本地代码,执行相应的功能。
  • 资源管理: 注意JNI中需要管理内存和资源,防止内存泄漏和资源泄漏。


需要注意的是,使用JNI涉及到一些底层的编程技巧,以及对内存管理、线程安全等问题的处理。不当的使用可能会导致性能问题和安全隐患。

2 基本概念描述

2.1 基本数据类型

JNI 对于 Java 的基础数据类型(int 等)和引用数据类型(Object、Class、数组等)的处理方式不同。这个原理非常重要,理解这个原理才能理解后面所有 JNI 函数的设计思路:

基础数据类型: 会直接转换为 C/C++ 的基础数据类型,例如 int 类型映射为 jint 类型。由于 jint 是 C/C++ 类型,所以可以直接当作普通 C/C++ 变量使用,而不需要依赖 JNIEnv 环境对象;


引用数据类型: 对象只会转换为一个 C/C++ 指针,例如 Object 类型映射为 jobject 类型。由于指针指向 Java 虚拟机内部的数据结构,所以不可能直接在 C/C++ 代码中操作对象,而是需要依赖 JNIEnv 环境对象。另外,为了避免对象在使用时突然被回收,在本地方法返回前,虚拟机会固定(pin)对象,阻止其 GC。(参考demo中的multipleArray函数实现)


另外需要特别注意一点,基础数据类型在映射时是直接映射,而不会发生数据格式转换。例如,Java char 类型在映射为 jchar 后旧是保持 Java 层的样子,数据长度依旧是 2 个字节,而字符编码依旧是 UNT-16 编码。

以下为Java类型与JNI类型的映射关系表,C++开发人员需要特别注意表中byte与char的区别。

Java类型JNI类型描述长度(字节)
booleanjbooleanunsinged char1
bytejbytesigned char1
charjcharunsinged short2
shortjshortsigned short2
intjint, jsizesigned int4
longjlongsigned long8
floatjfloatsigned float4
doublejdoublesigned double8
ClassjclassClass类/
Stringjstring字符串类/
Objectjobject所有java类的父类/
Throwablejthrowable异常对象/
boolean[]jbooleanArray布尔数组/
byte[]jbyteArraybyte数组/
char[]jcharArraychar数组/
s

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

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

相关文章

无字母数字rce总结(自增、取反、异或、或、临时文件上传)

目录 自增 取反 异或 或 临时文件上传 自增 自 PHP 8.3.0 起,此功能已软弃用 在 PHP 中,可以递增非数字字符串。该字符串必须是字母数字 ASCII 字符串。当到达字母 Z 且递增到下个字母时,将进位到左侧值。例如,$a Z; $a;将…

C++知识点总结(23):高级模拟算法

高级模拟算法例题 一、P5661 公交换乘1. 审题2. 思路3. 参考答案 二、P1003 铺地毯1. 审题2. 参考答案 三、P1071 潜伏者1. 审题2. 思路3. 参考答案 一、P5661 公交换乘 1. 审题 2. 思路 总花费中,地铁是必须花费的,公交车可能不花钱(坐地…

使用VisualDL进行模型训练和数据可视化

文章目录 使用VisualDL进行模型训练和数据可视化1. 环境准备1.1 安装VisualDL1.2 设置VisualDL 2. 写入数据并可视化2.1 检查训练数据2.2 跟踪模型训练2.3 评估模型训练效果 3. 启动VisualDL服务4. 总结 使用VisualDL进行模型训练和数据可视化 VisualDL是飞桨提供的一个可视化…

Java中的Object类详解

Java中的Object类详解 1. equals(Object obj)2. hashCode()3. toString()4.getClass()5.notify() 和 notifyAll()6. wait() 和 wait(long timeout)7. clone()8.finalize() Java中的 Object 类是所有类的父类,可以被所有Java类继承并使用。下面先看下源码&#xff1a…

google最新大语言模型gemma本地化部署

Gemma是google推出的新一代大语言模型,构建目标是本地化、开源、高性能。 与同类大语言模型对比,它不仅对硬件的依赖更小,性能却更高。关键是完全开源,使得对模型在具有行业特性的场景中,有了高度定制的能力。 Gemma模…

革新商务数据体验:引领市场的API商品数据接口

在当今商业环境中,革新商务数据体验对于维持竞争优势至关重要。API商品数据接口在这一转型过程中扮演了核心角色,它不仅为企业提供了实时且全面的数据访问能力,而且还极大地增强了数据的可操作性和决策支持功能。以下是API商品数据接口如何细…

面试数据库篇(mysql)- 12分库分表

拆分策略 垂直分库 垂直分库:以表为依据,根据业务将不同表拆分到不同库中。 特点: 按业务对数据分级管理、维护、监控、扩展在高并发下,提高磁盘IO和数据量连接数垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。 特点: 1,冷热数据分离 2,减少IO过渡争…

C语言入门到精通之练习42:画图,学用圆画圆形。

题目&#xff1a;画图&#xff0c;学用圆画圆形。 程序分析&#xff1a;无。 实例 #include <graphics.h> //VC6.0中是不能运行的&#xff0c;要在Turbo2.0/3.0中 int main() { int driver,mode,i; float j1,k1; driverVGA; modeVGAHI; initgraph(&d…

【Micropython基础】TCP客户端与服务器

文章目录 前言一、连接Wifi1.1 创建STA接口1.2 激活wifi接口1.3 连接WIFI1.4 判断WIFI是否连接1.5 连接WIFI总体代码 二、创建TCP 客户端2.1 创建套接字2.2 设置TCP服务器的ip地址和端口2.3 连接TCP服务器2.3 发送数据2.4 接收数据2.5 断开连接2.6 示例代码 三、TCP服务器的创建…

批量二维码的教程和优势:拓宽应用领域,提升效率与创新

随着二维码技术的不断发展&#xff0c;批量二维码在多个领域展现出了显著的优势&#xff0c;为商业和行业带来了更多便捷和创新。以下是批量二维码的一些显著优势&#xff1a; 1. 高效快速生成&#xff1a; 批量二维码一次性生成多个二维码&#xff0c;相较于逐个生成的方式&…

Linux之进程信号

目录 一、概念引入 1、生活中的信号 2、Linux中的信号 二、信号处理常见方式 三、信号的产生 1、键盘产生信号 2、系统调用接口产生信号 3、软件条件产生信号 4、硬件异常产生信号 四、信号的保存 相关概念 信号保存——三个数据结构 信号集——sigset_t 信号集操…

超简单的chatgpt-next-web部署教程!

随着AI的应用变广&#xff0c;各类AI程序已逐渐普及&#xff0c;尤其是在一些日常办公、学习等与撰写/翻译文稿密切相关的场景&#xff0c;大家都希望找到一个适合自己的稳定可靠的ChatGPT软件来使用。 ChatGPT-Next-Web就是一个很好的选择。它是一个Github上超人气的免费开源…

Docker基础教程 - 1 Docker简介

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 1 Docker简介 Docker是一个强大的容器化平台&#xff0c;让你能够更轻松地构建、部署和运行应用程序。 下面我们来学习 Docker。 1.1 Docker是什么 1 现在遇到的问题 每次部署一台服务器&…

CSS 入门指南(一)CSS 概述

CSS 概述 CSS 介绍 CSS&#xff08;Cascading Style Sheets&#xff09;通常称为 CSS 样式或层叠样式表&#xff0c;是一种用来为结构化文档&#xff08;如 HTML 文档或 XML 应用&#xff09;添加样式&#xff08;字体、间距和颜色等&#xff09;以及版面的布局等外观显示样式…

《MySQL数据库》day1

文章目录 1.名词解释2.如何启动mysql数据库3.mysql常用命令4.数据库当中最基本的单元是表&#xff1a;table5.关于SQL语句的分类6.简单查询7.条件查询8.排序9.数据处理函数单行处理函数常见的有哪些&#xff1f; 10.分组函数&#xff08;多行处理函数&#xff09; 1.名词解释 …

VUE2与VUE3之间的主要区别

当谈到 Vue.js 的版本时&#xff0c;Vue 2 和 Vue 3 是最常被提及的两个版本。下面是 Vue 2 和 Vue 3 之间的一些主要区别&#xff1a; 1. 性能提升&#xff1a; Vue 3 在底层核心重写了响应式系统&#xff0c;采用了 Proxy 对象&#xff0c;大幅提高了性能。Vue 3 还引入了静…

彻底解决华为手机安装谷歌框架后出现未认证的弹窗问题

引言 本人使用华为手机通过B站等平台学习如何安装谷歌框架与商店后&#xff0c;发现安装谷歌框架后出现未认证的弹窗问题少有解决办法&#xff0c;而且容易复发&#xff0c;在借鉴相关视频后找到解决办法&#xff0c;但视频中的华谷框架需要付费才能使用&#xff0c;本文将提出…

spring注解驱动系列--自动装配

Spring利用依赖注入&#xff08;DI&#xff09;&#xff0c;完成对IOC容器中中各个组件的依赖关系赋值&#xff1b;依赖注入是spring ioc的具体体现&#xff0c;主要是通过各种注解进行属性的自动注入。 一、Autowired&#xff1a;自动注入 一、注解介绍 1、默认优先按照类型去…

高中数学:函数奇偶性

一、定义 偶函数&#xff1a;定义域关于原点对称&#xff0c;图像关于Y轴对称 f(x)f(-x) 奇函数&#xff1a;定义域关于原点对称&#xff0c;图像关于原点中心对称 f(x)f(-x)0 等价于 f(-x)-f(x) 二、函数奇偶性的四种情况 注意&#xff1a; 即奇又偶的函数&#xff0c;只有…

Linux入门到入土

Linxu Linux 简介 Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX&#xff08;可移植操作系统接口&#xff09…