如何快速使用JNI

news2024/12/22 15:11:11

文章目录

    • 1_JNI是什么?
    • 2_使用
    • 3_扩展

1_JNI是什么?

JNI 是Java Native Interface的缩写,通过JNI,允许Java代码与其他语言(通常是C或C++)编写的本地应用程序或库进行交互。简而言之就是,Java可以通过JNI调用C 或 C++ 语言写的代码。

2_使用

1、首先,准备一个demo让我们进行JNI的快速入门使用:

/**
 * @author shenyang
 * @version 1.0
 * @info JNI
 * @since 2024/6/29 下午5:03
 */
public class JNIDemo {
    public static void main(String[] args) {
    	System.out.println(System.getProperty("java.library.path"));
        System.out.println(add(1,2));
    }
}

2、需要将C/C++实现的方法用native关键字声明。

  • native关键字声明的方法我们就不需要给出方法体了,直接给出声明就好了。
public static native int add(int a, int b);//这个方法的作用是将两个整型相加

3、加载动态链接库(windows.dll为后缀,linux上.so为后缀名),通常是使用静态代码块来进行导入。

  • 使用 System对象的 public static void loadLibrary(String libname)方法不需要后缀,只要(库所在路径加上)库名。
static {
    System.loadLibrary("jniDemo");
}

4、使用 javac -hjavah生成.h为后缀的头文件

  • 注意:jdk10之后将javah这一命令移除了,JEP313: 移除JDK中附带的javah工具。
  • 注意下面第一个参数是存放到当前路径下(./
javac -h ./ JNIDemo.java
  • 生成的头文件JNIDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> //这个头文件在jdk/include/下
/* Header for class JNIDemo */

#ifndef _Included_JNIDemo
#define _Included_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JNIDemo 说明这个方法是在哪个类里
 * Method:    add     对应的是java中的add方法
 * Signature: (II)I	  括号里两个II表示第一个参数和第二个参数都是int类型,括号后面的I表示这个方法的返回值是int类型
 * 下面这部分是C++需要实现的函数声明
 */
JNIEXPORT jint JNICALL Java_JNIDemo_add
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

下面这部分是C++需要实现的函数声明:

JNIEXPORT jint JNICALL Java_JNIDemo_add
  (JNIEnv *, jclass, jint, jint);

5、根据生成的头文件里的函数声明实现对应的函数,创建JNIDemo.cpp文件。

  • 注意:下面的代码包含了之前生成的头文件JNIDemo.h,还需要其他头文件也可以一并包含进去,比如:iostream
  • 下面四个参数:JNIEnv *是一个指针封装了一些JNI的操作在里面,jclass参数也用不到只放一个参数类型就行了,后面两个参数因为用的到所以把参数名加上。
  • 函数的最终目的是返回a+b,再加上一些其他操作我们进行测试;
#include "JNIDemo.h"
#include <iostream>

JNIEXPORT jint JNICALL Java_JNIDemo_add(JNIEnv *, jclass , jint a, jint b)
{
    std::cout <<"a = "<< a<<"	b= "<< b <<std::endl;
    return a+b;
}

6、将上面的cpp文件编译成动态链接库。

给对C++不太了解的同学解释下下面命令的意义:

  • -o jniDemo.dll: 指定输出文件的名称为jniDemo.dll(与System.loadLibrary("jniDemo")中保持统一)。在Windows系统上,动态链接库通常以.dll为扩展名。

  • -fPIC: 表示生成位置无关代码(Position-Independent Code)。这是生成共享库时常用的选项,使得生成的代码在加载到内存中的任何位置时都可以正确运行。

  • -shared: 指定生成一个共享库(动态链接库),而不是可执行文件。

  • -I: 包含路径选项,用于指定头文件所在目录。在这里,包含了特定于Windows系统的Java头文件。

  • JNIDemo.cpp: 源文件名,包含了具体的JNI方法实现。

  • 如果windows电脑上使用不了g++命令,那么可以下载MinGWX64 - x86_64-win32-sjlj。

g++ -o jniDemo.dll -fPIC -shared -I"E:\shenyang\.jdks\jdk-1.8\include\win32" -I"E:\shenyang\.jdks\jdk-1.8\include" JNIDemo.cpp

执行完毕后发先目录下出现jniDemo.dll文件:

在这里插入图片描述

最后运行 JNIDemo.java ,查看运行结果:

在这里插入图片描述

3_扩展

基础数据类型对应表:

Java 类型JNI 类型C/C++ 类型描述
booleanjbooleanunsigned char布尔类型,值为truefalse ,使用0表示false,非0表示true
bytejbytesigned char8位有符号整数
charjcharunsigned short16位无符号Unicode字符
shortjshortshort16位有符号整数
intjintint32位有符号整数
longjlonglong long64位有符号整数
floatjfloatfloat32位单精度浮点数
doublejdoubledouble64位双精度浮点数
voidvoidvoid无类型

引用数据类型对应表:

Java 类型JNI 类型描述
StringjstringJava字符串
Objectjobject任意Java对象
ClassjclassJava类
ThrowablejthrowableJava异常对象
boolean[]jbooleanArray布尔型数组
byte[]jbyteArray字节型数组
char[]jcharArray字符型数组
short[]jshortArray短整型数组
int[]jintArray整型数组
long[]jlongArray长整型数组
float[]jfloatArray单精度浮点型数组
double[]jdoubleArray双精度浮点型数组
任意类型的对象数组jobjectArray对象数组
Java数组中的任意类型jarray通用数组类型

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

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

相关文章

【王佩丰 Excel 基础教程】第一讲:认识Excel

文章目录 前言一、Excel软件简介1.1、历史上的其他数据处理软件与 Microsoft Excel1.2、Microsoft Excel 能做些什么1.3、Excel 界面介绍 二、Microsoft Excel 的一些重要概念2.1、Microsoft Excel 的几种常见文件类型2.2、工作簿、工作表、单元格. 三、使用小工具&#xff1a;…

基于RK3588的GMSL、FPDLink 、VByone及MIPI等多种摄像模组,适用于车载、机器人工业图像识别领域

机器人&工业摄像头 针对机器人视觉与工业检测视觉&#xff0c;信迈自主研发和生产GMSL、FPDLink 、VByone及MIPI等多种摄像模组&#xff0c;并为不同应用场景提供多种视场角度和镜头。拥有资深的图像算法和图像ISP专家团队&#xff0c;能够在软件驱动层开发、ISP算法、FPG…

电通出席2024年世界经济论坛(WEF),重申推动可持续发展创新和人才培育的承诺

中国&#xff0c;上海——电通将出席世界经济论坛2024年新领军者年会&#xff08;夏季达沃斯&#xff09;&#xff0c;本次大会将于6月25日至6月27日在中国大连举行。 2024年世界经济论坛主题为“未来增长的新前沿”&#xff0c;将聚焦于全球经济复苏、通胀缓解&#xff0c;以…

Softmax函数的作用

Softmax 函数主要用于多类别分类问题&#xff0c;它将输入的数值转换为概率分布。 具体来说&#xff0c;对于给定的输入向量 x [x_1, x_2,..., x_n] &#xff0c;Softmax 函数的输出为 y [y_1, y_2,..., y_n] &#xff0c;其中&#xff1a; 这样&#xff0c;Softmax 函数的输…

生成式人工智能和机器人技术是否即将取得最后的突破?

了解生成式人工智能与机器人技术的融合如何彻底改变从医疗保健到娱乐等行业 想象一下这样一个世界&#xff0c;机器人可以谱写交响乐、画出杰作、写出小说。这种创造力与自动化的迷人融合&#xff0c;由 生成式人工智能&#xff0c;不再是梦想&#xff1b;它正在以重大方式重塑…

25岁庆生|人大金仓带你这样过!

25年&#xff0c;是一个重要的时间节点 一个世纪的四分之一 百年基业的第一站&#xff0c;我们已经走过 人大金仓即将25岁了&#xff0c;感谢有你 趣味运动会 今日上午 二十五周年司庆终极活动正式开启 北京、成都、天津、青岛、西安 五地同步举行趣味运动会 活力四射的集体健走…

ros1仿真导航机器人 hector_mapping gmapping

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1 hector_mapping 建图过程 &#xff08;1&#xff09;gazebo仿真 roslaunch why_simulation why_slam.launch <launch><!-- We resume the logic in empty_world.launch, changing only the name of t…

鸿蒙开发Ability Kit(程序框架服务):【选择申请权限的方式】

选择申请权限的方式 应用在访问数据或者执行操作时&#xff0c;需要评估该行为是否需要应用具备相关的权限。如果确认需要目标权限&#xff0c;则需要在应用安装包中申请目标权限。 每一个权限的权限等级、授权方式不同&#xff0c;申请权限的方式也不同&#xff0c;开发者在…

Spring Boot项目如何配置跨域

1、通过SpringSecurity进行配置 2、前端跨域配置&#xff1a;proxy配置项用于设置代理规则&#xff0c;用于前端开发中与后端API交互时使用。

llama.cpp

https://github.com/echonoshy/cgft-llm 【大模型量化】- Llama.cpp轻量化模型部署及量化_哔哩哔哩_bilibili github.com/ggerganov/llama.cpp cd ~/code/llama.cpp/build_cuda/bin ./quantize --allow-requantize /root/autodl-tmp/models/Llama3-8B-Chinese-Chat-GGUF/Llama…

RISC-V异常处理流程概述

RISC-V异常处理流程概述 一、RISC-V异常处理流程和异常委托1.1 异常处理流程1.2 异常委托二、RISC-V异常处理中软件相关内容2.1 异常处理准备工作2.2 异常处理函数2.3 Opensbi系统调用的注册三、参考资料一、RISC-V异常处理流程和异常委托 1.1 异常处理流程 发生异常时,首先…

grpc编译

1、cmake下载 Download CMakehttps://cmake.org/download/cmake老版本下载 Index of /fileshttps://cmake.org/files/2、gprc源码下载&#xff0c;发现CMAKE报错 3、使用git下载 1&#xff09;通过git打开一个目录&#xff1a;如下grpc将放在D盘src目录下 cd d: cd src2&am…

CesiumJS【Basic】- #027 加载倾斜摄影文件

文章目录 加载倾斜摄影文件1 目标2 代码2.1 main.ts3 资源加载倾斜摄影文件 1 目标 加载倾斜摄影文件(通常是.json和.b3dm配套使用) 2 代码 有意改变了高度,因为大部分情况下是需要手动调节高度的 2.1 main.ts import * as Cesium from cesium;const viewer = new Ces…

基于Java的旅游景区网站系统(springboot+vue)

作者介绍&#xff1a;计算机专业研究生&#xff0c;现企业打工人&#xff0c;从事Java全栈开发 主要内容&#xff1a;技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流&#xff08;SCI论文两篇&#xff09; 上点关注下点赞 生活越过…

YonBIP 获取项目代码配置(图文)

项目开发文件在本地环境重新部署后&#xff0c;开发端机器需要重新部署&#xff0c;在此记录一下操作过程。 1. 新建项目目录&#xff0c;在目录下点鼠标右键&#xff0c;选 Git Bash Here 2. 开始下载代码&#xff0c;根据代码量多少&#xff0c;几分钟就能下载完成。 3. 下载…

深入模拟版图工程师基础学习:CMOS工艺解析

作为模拟版图工程师&#xff0c;了解CMOS&#xff08;互补金属氧化物半导体&#xff09;工艺是非常重要的&#xff0c;以下是我们需要掌握的基本内容&#xff1a; 1.基础理论&#xff1a;理解CMOS工艺的基本原理和结构&#xff0c;包括NMOS和PMOS晶体管的构造及其工作原理。&a…

30 哈希的应用

位图 概念 题目 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何判断一个数是否在这40亿个整数中 1.遍历&#xff0c;时间复杂度O(N) 2.二分查找&#xff0c;需要先排序&#xff0c;排序(N*logN)&#xff0c;二分查找&#xff0c;logN。…

什么是BIOS,如何进入BIOS设置?

什么是BIOS&#xff0c;如何进入BIOS设置&#xff1f;标题 &#x1f5a5;️ 什么是BIOS&#xff0c;如何进入BIOS设置&#xff1f;——默语的深入解析摘要引言正文内容&#x1f9e9; 什么是BIOS&#xff1f;&#x1f527; 如何进入BIOS设置&#xff1f;⚙️ 常见的BIOS设置选项…

【04】从0到1构建AI生成思维导图应用 -- 创建 AI 工作流

【04】从0到1构建AI生成思维导图应用 – 创建 AI 工作流 大家好&#xff01;最近自己做了一个完全免费的AI生成思维导图的网站&#xff0c;支持下载&#xff0c;编辑和对接微信公众号&#xff0c;可以在这里体验&#xff1a;https://lt2mind.zeabur.app/ 上一章&#xff1a;h…

012、GridFS文件查询过程深度解析

目录 GridFS文件查询过程深度解析 1. GridFS基本概念 2. 查询过程详解 2.1 查询文件元数据 2.2 计算块数量和范围 2.3 查询文件块 2.4 组装文件内容 3. 优化查询性能 3.1 索引优化 3.2 流式处理 4. 高级查询技巧 4.1 范围查询 4.2 元数据查询 5. GridFS查询性能研…