JNI原理是什么?JNI在DDS binding JAVA中/DDS移植android平台中有什么作用?

news2024/12/23 6:31:34

  • 1 JNI是什么
  • 2 如何在JAVA中调用C/C++方法(通过JNI调用的demo)
      • java中声明一个本地native方法
      • 生成JNI头文件
      • Java native方法转换成C的规则与语法说明
      • C实现的native方法本地实现以及.o .dll库的生成
      • 查看hello.dll库中的函数
      • 运行一下HelloJNI
  • JNI在DDS移植android平台的作用

1 JNI是什么

总结几点重要的如下:

  1. JNI是用来实现java代码和本地native方法(比如一些C C++实现的代码)之间交互的一种框架,同时也是java标准里面的一部分,是Java平台定义的规范接口;
    private native void native_init();
    private native void native_sub(int domainID);

点击这些native方法进行跳转,可以看到native方法的实现是C++代码所完成,即native方法的实现;
在这里插入图片描述

  1. 为了更好的与操作系统级别以及硬件级别交互,并且为了完成某些计算密集型的任务,很多本地代码都是通过C、C++来实现的,这要比纯java代码高效一些。然后java代码JNI与这些底层代码进行交互;
  2. java代码通过JNI来调用本地方法(本地方法就是关键字为native的java方法,并且不能有方法体), 所以JNI也是一个桥梁;也可以说通过JNI可以将C/C++代码集成在Java中
  3. 使用native关键字将某方法声明为本地实例方法,这就很明显地告诉JVM:这个方法实现在另外一个语言中(C/C++),请去那里寻找他的实现

2 如何在JAVA中调用C/C++方法(通过JNI调用的demo)

整体的调用逻辑就在这张图上面

1、创建一个java源码,并且里面声明一个native关键字修饰的本地方法,该方法没有方法体;
2、通过javah工具,或者javac -h 产生JNI的.h头文件,过程中会同时产生.class文件。产生JNI头文件所需要的官方jni.h和jni_md.h都在JDK11 的安装包里面;
3、然后实现一个.c文件,这个.c文件就是真正要干的事情,而且JNI头文件和.c之间是有一定的对应关系的。
4、然后将.c文件通过gcc生成win下的共享库.dll
5、运行java。通过javac产生.class字节码文件,然后通过java XXX的命令运行起来。这时候java虚拟机会去通过System.loadLibrary调用共享库,找到native方法的C实现的代码,执行里面的流程

在这里插入图片描述
注意:javah到.h这一步,可能通过javac -h . XXX.java替代

🐵下面通过例子来描述:

java中声明一个本地native方法

java当中有个很重要的点,一个源文件中可以有多个类,但是只有一个public类。而且源文件的名称必须与public类的名称相同;

package org.example;

public class HelloJNI {
    static {
        System.loadLibrary("hello");
    }

    private native void sayHello();

    public static void main(String[] args) {
        new HelloJNI().sayHello();
    }
}

生成JNI头文件

在终端javac -h . D:\IDC\Android\testJNI\src\main\java\org\example\HelloJNI.java 告诉 javac 编译器生成一个 C/C++ 头文件(JNI 头文件),以便与本地代码(如 C 或 C++)交互。javac XX.java是产生java的中间文件
请注意这里我写的java文件的绝对路径,后面会解释,接着往后走

1、 javac:Java 编译器,用于编译 Java 源文件。
2、-h .:-h 选项告诉 javac 生成一个 JNI 头文件,. 表示将头文件放置在当前目录下。
3、HelloJNI.java:指定要编译的 Java 源文件。

生成头文件可以通过javac -h <dir> XX.java ,也可以通过javah -d 的方式,javac -hjavah 都可以用于生成 JNI 头文件,但 javac -h 更倾向于在编译 Java 源文件的过程中生成头文件,而 javah 是一个独立的工具,主要用于生成头文件

如下图所示,生成了头文件org_example_HelloJNI.h
在这里插入图片描述
在这里插入图片描述

Java native方法转换成C的规则与语法说明

上面的生成函数中,可以看到JNI中生成的C函数是:Java_org_example_HelloJNI_sayHello (JNIEnv *, jobject);

  1. JNIEnv *:指向JNI运行环境的指针,可通过这个指针访问JNI函数
  2. jobject:java中的this对象
  3. extern “C” : 告诉编译器,这是C函数;

所以其规则是:Java_{package_and_classname}_{function_name}(JNI arguments),Java_包名_类名_native方法名

C实现的native方法本地实现以及.o .dll库的生成

HelloJNI.c代码如下,打印一行字符即可。

#include <jni.h>
#include <stdio.h>
//#include "HelloJNI.h"

// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_org_example_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}

通过JDK编译HelloJNI.c文件产生.o 文件

gcc -c -I "D:\JDK11\include" -I "D:\JDK11\include\win32" HelloJNI.c

其中jni.h文件分别在JAVA_HOME下的include和include\win32下面

然后通过JDK编译HelloJNI.c文件产生.dll文件
在这里插入图片描述
注意不要在终端里面操作,powershell会认为某些参数不对
直接在黑窗口操作就不会报错
在这里插入图片描述
如下图所示
在这里插入图片描述
三种文件分别是:.C是源文件;.o是中间文件,还没有被链接成可执行文件或者库文件;.dll是win下的动态链接库;

查看hello.dll库中的函数

如果是在linux上面的话使用:nm hello.dll | grep say
如果是在win环境编的,在黑窗口中用:objdump -t hello.dll | findstr /R /C:"say"
在这里插入图片描述

运行一下HelloJNI

打印的hello,world
请注意,如果我们想要通过JDK编译java产生.class文件后运行的话,必须后面跟着绝对路径,这里报错了好久,先这么记下。
在这里插入图片描述

JNI在DDS移植android平台的作用

持续更新…

【参考文献】
JNI基础知识总结
Java——本地方法(JNI)详解
Java Native Interface(JNI)从零开始详细教程

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

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

相关文章

微信小程序 - 自定义计数器

微信小程序通过自定义组件&#xff0c;实现计数器值的增加、减少、清零、最大最小值限定、禁用等操作。通过按钮事件触发方式&#xff0c;更新计数器的值&#xff0c;并修改相关联的其它变量。通过提升用户体验&#xff0c;对计数器进行优化设计&#xff0c;使用户操作更加便捷…

PHP教育培训小程序系统源码

&#x1f680;【学习新纪元】解锁教育培训小程序的无限可能✨ &#x1f4da; 引言&#xff1a;教育培训新风尚&#xff0c;小程序来引领&#xff01; Hey小伙伴们&#xff0c;是不是还在为找不到合适的学习资源而烦恼&#xff1f;或是厌倦了传统教育模式的单调&#xff1f;今…

Monaco 使用 SignatureHelpProvider

Monaco 中 SignatureHelpProvider 是方法提示说明&#xff0c;当敲入方法名时&#xff0c;系统会提示方法名称和对应的参数信息。效果如下&#xff1a; 通过 registerSignatureHelpProvider 实现 SignatureHelpProvider 处理函数。 实现 signatureHelpTriggerCharacters 和 pro…

我们如何优化 Elasticsearch Serverless 中的刷新成本

作者&#xff1a;来自 Elastic Francisco Fernndez Castao, Henning Andersen 最近&#xff0c;我们推出了 Elastic Cloud Serverless 产品&#xff0c;旨在提供在云中运行搜索工作负载的无缝体验。为了推出该产品&#xff0c;我们重新设计了 Elasticsearch&#xff0c;将存储与…

深入了解下 Markdown 的原理

前面讲了 Markdown 的基本语法&#xff0c;常见的 Markdown 编辑器&#xff0c;在继续讲解其他知识之前&#xff0c;有必要稍微深入了解一下 Markdown 与 HTML 的关系。 ‍ ‍ HTML 简介 什么是 HTML&#xff1f;其实它也是标记语言的一种&#xff0c;但是比 Markdown 更重…

Java面试题--JVM大厂篇之深入分析Parallel GC:从原理到优化

目录 引言: 正文&#xff1a; 1. Parallel GC原理解析 2. Parallel GC关键参数配置 3. 常见调优场景与技巧 4. 监控与日志分析 结束语&#xff1a; 引言: 在Java应用程序中&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;扮演着至关重要的角色。对…

【学术会议征稿】第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)

第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024) 2024 3rd International Conference on Image Processing, Computer Vision and Machine Learning 重要信息 大会官网&#xff1a;参会投稿/了解会议详情 大会时间&#xff1a;2024年11月22日-24日 大会地…

大米cms支付逻辑漏洞

1.打开环境 注册账户 随机选择一个产品 修改数据

什么是折叠幼儿床?该如何认证?

​折叠幼儿床具有如下特征&#xff1a; 轻巧便携 用于睡眠的幼儿床&#xff0c;不使用时会折叠 有幼儿护栏&#xff0c;且必须带底板&#xff08;不包括没有地板的婴儿围栏&#xff09; 图片 亚马逊政策规定&#xff0c;通过亚马逊网站销售的折叠幼儿床必须符合特定标准的测…

视频转文字在线提取怎么弄?5款软件帮你解决

三伏天炎炎&#xff0c;阳光炽热&#xff0c;视频内容分享正当时。然而&#xff0c;在海量视频信息中快速提取关键信息却成了难题。试想&#xff0c;如果能一键将视频中的精彩讲解或会议要点转换成文字&#xff0c;岂不省时又高效&#xff1f; 那么问题来了&#xff0c;面对市…

项目实战--不推荐使用@Autowired实现注入

不推荐使用Autowired实现字段注入 一、前言二、字段注入2.1 字段注入的使用2.2 字段注入的弊端2.2.1 与Spring的IOC机制紧密耦合2.2.2 无法使用final修饰符2.2.3 隐藏依赖性2.2.4 无法对注入的属性进行安全检查2.2.5 掩饰单一职责的设计思想 三、设值注入四、构造器注入五、总结…

前端面试:项目细节重难点问题分享(十五)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…

ComfyUI 实战教程:图片添加文字

大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 在AI绘画中书写文字一直是个老大难的问题&#xff0c;直到SDXL的出现&#xff0c;文字生成才迎来转机&#xff0c;可以在提示词中指定一些英文字符&#xff0c;不过也是经常出错&#xff0c;生成中文就更加不可求了…

uView input输入框和search输入框实现搜索功能

背景&#xff1a; 在手机端实现搜索框的“查询功能”&#xff0c;使用uView组件库。有两种实现思路&#xff1a; 1.input输入框 2.search搜索框 效果展示&#xff1a; 一、search搜索框 官方文档&#xff1a;点击跳转uView官网 实际代码&#xff1a; //u-search组件 <u-se…

人生五大成熟表现

三十而立&#xff1b;立什么&#xff1f;立身、立业、立家&#xff1b; 四十不惑&#xff1b;明白了什么&#xff1f;明白了社会&#xff0c;责任、自己&#xff1b; 五十知天命&#xff1b;知道了什么&#xff1f;知道了命运轨迹&#xff0c;人生定位&#xff1b; 六十而顺&am…

58 简单学生管理系统【项目需求、数据库搭建、项目搭建、功能实现(注册功能、登录功能完善验证码功能(Session-会话对象))】

简单学生管理系统 项目需求 数据库搭建 数据库建表 导数据库sql 了解 项目搭建 导包&#xff0c;基础页面&#xff0c;实体类&#xff0c;工具类 基础页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><ti…

深入实践,浅谈EHS管理的智能化转型

随着人工智能、大数据、云计算等先进技术的飞速发展&#xff0c;EHS管理体系与管理软件的融合正步入一个全新的智能化时代。这一转型不仅进一步提升了EHS管理的效率和精准度&#xff0c;还为企业带来了前所未有的管理视野和决策支持。 一、创新驱动&#xff0c;深化EHS管理的智…

深入探讨Google谷歌助力孟加拉slots游戏广告市场前景

深入探讨Google谷歌助力孟加拉slots游戏广告市场前景 在深入探讨孟加拉游戏广告投放于Google谷歌平台的优势时&#xff0c;不得不提及其强大的数据分析与精准定位能力。谷歌广告平台拥有全球领先的数据处理技术&#xff0c;能够基于用户的搜索历史、浏览行为、地理位置等多维度…

C语言程序设计24

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.1 求下列算数表达式的值 &#xff08;1&#xff09;xa%3*(int)(xy)%2/4 设x2.5,a7,y4.7 (2)(float)(ab)/2(int)x%(int)y 设 a2,b3,x3.5,y2.5 代码&#xff08;1&#xff09;&#xff1a;…

贪心系列专题篇三

目录 单调递增的数字 坏了的计算器 合并区间 无重叠区间 用最少数量的箭 声明&#xff1a;接下来主要使用贪心法来解决问题&#xff01;&#xff01;&#xff01; 单调递增的数字 题目 思路 如果我们遍历整个数组&#xff0c;然后对每个数k从[k,0]依次遍历寻找“单调递…