JNI 调用

简介

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

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

使用JNI和算法进行交互,主要是为了提高算法的性能,最大化的利用机器硬件资源。

JAVA端

1.首先编写native方法
在这里插入图片描述

public class JniJavaTest {
    public static native int jniSum(int x, int y);

    public static native String jniHello(String name);
}

2.执行编译

因为我使用的是java jdk11,所以直接到jdk的目录下进行执行。

D:\Library\jdk-11.0.15\bin>javac E:\090-WORKSPACE\jnitest01\jnitest01\JniJavaTest.java

这样就会生成一个.class文件

在这里插入图片描述

3.生成.h文件,C++编码需要引用的

D:\Library\jdk-11.0.15\bin>javac -h E:\090-WORKSPACE\jnitest01\jnitest01\ E:\090-WORKSPACE\jnitest01\jnitest01\JniJavaTest.java

这样就会在目录下生成一个.h文件

在这里插入图片描述

JniJavaTest.h

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

#ifndef _Included_JniJavaTest
#define _Included_JniJavaTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniJavaTest
 * Method:    jniSum
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_JniJavaTest_jniSum
  (JNIEnv *, jclass, jint, jint);

/*
 * Class:     JniJavaTest
 * Method:    jniHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_JniJavaTest_jniHello
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

C++ 端

我这边采用的是Visual Studio 2022

1.创建一个Demo动态库

在这里插入图片描述

名称为JniDll,初始化文件如下:

在这里插入图片描述

2.创建一个类,并把.h文件的内容复制进去

在这里插入图片描述

如果提示无法打开源文件jni.h,主要原因是没有加载jni库。

在VS项目中右键,选择“属性”,在弹出的窗口中选择“VC++ 目录”,然后编辑右侧的“包含目录”

在这里插入图片描述

选择D:\Library\jdk-11.0.15\include和D:\Library\jdk-11.0.15\include\win32

在这里插入图片描述

3.实现.h方法并编译

在这里插入图片描述

Java调用库执行

1.获得当前运行库的位置

public static void main(String[] args) {
    //打印库的位置
    System.out.println(System.getProperty("java.library.path"));
}

在这里插入图片描述

2.把DLL复制进去

在这里插入图片描述

3.执行

/**
 * @author zhe.xiao
 * @date 2023-04-03 20:01
 * @description
 **/
public class JniJavaTest {
    public static native int jniSum(int x, int y);

    public static native String jniHello(String name);

    static {
        System.loadLibrary("JniDll");
    }

    public static void main(String[] args) {
        //打印库的位置
        System.out.println(System.getProperty("java.library.path"));

        int i = JniJavaTest.jniSum(5, 5);
        System.out.println(i);

        String s = JniJavaTest.jniHello("zhexiao");
        System.out.println(s);
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ChatGPT】ChatGPT-5 强到什么地步?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 ChatGPT-5 强到什么地步&#xff1f; 技术 深度学习模型的升级 更好的预测能力 自适应学习能力 特点 语言理解能力更强 自我修正和优化 更广泛的应用领域 应用 对话系统 智能写作…

【机器学习】吴恩达机器学习Deeplearning.ai

机器学习已经强大到可以独立成为人工智能的一个子领域。 可以通过对机器编程实现比如执行网络搜索、理解人类语言、通过x光诊断疾病&#xff0c;或制造自动驾驶汽车。 机器学习定义 一般来说&#xff0c;给一个算法学习的机会越多&#xff0c;它的表现就越好。 机器学习的两种…

阿里云5、6代云服务器实例免费升级至第7代(不限次数)

简介&#xff1a; 阿里云推出云服务器实例免费升级至第7代优惠活动&#xff0c;第5、&#xff16;代云服务器&#xff0c;可享受实例部分免费升级至第7代实例&#xff0c;让你的云服务器拥有更高的安全、存储、网络等性能。 阿里云服务器升级有优惠吗&#xff1f;当然是有的&am…

长安信托:拥抱数字信托,探索多项目管理新路径

长安信托&#xff1a;公司使用 ONES 已经 2 年了。ONES 最大的优势是能够有效串联我司信息科技研发过程中的各个环节&#xff0c;从需求管理到研发任务跟踪&#xff0c;再到测试管理&#xff0c;ONES 能明确地展示出业务部门从需求提出到研发上线的全链路&#xff0c;体现信息科…

免费ChatGPT接入-国内怎么玩chatGPT

免费ChatGPT中文版 OpenAI 的 GPT 模型目前并不提供中文版的免费使用&#xff0c;但是有许多机器学习平台和第三方服务提供商也提供了基于 GPT 技术的中文版模型和 API。下面是一些常见的免费中文版 ChatGPT&#xff1a; Hugging Face&#xff1a;Hugging Face 是一个开源社区…

后缀为whl的文件是什么?如何安装whl文件?学习一下(22)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 了解并使用Pyhton的库安装包文件whl。 什么是whl文件 whl格式本质上是一个压缩包&#xff0c;里面包含了py文件&am…

chatGPA的主要功能-chatGPT深度分析

ChatGPT功能介绍 ChatGPT是基于深度学习技术的自然语言处理算法&#xff0c;其主要用途是生成自然语言文本&#xff0c;能够应用于多个自然语言处理任务。以下是其主要功能介绍&#xff1a; 文本生成&#xff1a;ChatGPT能够生成高质量的自然语言文本&#xff0c;可以应用于大…

linux常用系统管理经验谈

Lab1 硬件和安装 步骤一&#xff1a;准备计算机 任务&#xff1a; 使用Red Hat Linux光盘启动系统 在启动时进入BIOS界面 设置系统启动顺序为A&#xff0c;CDROM&#xff0c;C 修改其他任何推荐的设置 保存并退出BIOS设置 步骤二&#xff1a;使用Anaconda&#xff08;图形模式…

二十分钟带你了解JVM性能调优与实战进阶

ZGC 诞生原因 Java生态非常强大&#xff0c;但还不够&#xff0c;有些场景仍处于劣势&#xff0c;而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场。比如 谷歌主导的Android手机系统显示卡顿。证券交易市场&#xff0c;实时性要求非常高&#xff0c;目前主要是C主…

阿里云版GPT官宣,我们问了它10个问题

4月7日&#xff0c;阿里云宣布自研大模型“通义千问”&#xff0c;目前已开始邀请用户测试体验。 阿里达摩院在NLP自然语言处理等前沿科研领域早已布局多年&#xff0c;并于2019年启动大模型研发&#xff0c;通义千问便是其最新成果&#xff0c;相当于阿里云版的“ChatGPT”。 …

EPICS synApps SSCAN模块

1、在这个模块中有什么&#xff1f; 1&#xff09;代码 sscan记录busy记录recDynLink库saveData数据存储客户端scanparm记录 2&#xff09;EPICS数据库 scan数据库scanParms和alignParms数据库 3&#xff09;MEDM显示窗口 scan*.adlscan*_help.adl2、简单扫描 1&#xff0…

Linux系统【Centos7】设置防火墙教程

1. 查看防火墙状态 在终端输入以下命令&#xff1a; systemctl status firewalld 如果状态显示为“active”说明防火墙已经启动&#xff1b;如果状态显示为“inactive”说明防火墙没有启动。 2. 启动防火墙 在终端输入以下命令&#xff1a; systemctl start firewalld 3…

vue3自定义实现可过滤关键字的树形下拉选择框

背景 最近项目中有一个部门选择需求&#xff0c;一开始是用element-plus的级联下拉写的&#xff0c;但是由于层级过深&#xff0c;会出现级联下拉超出屏幕的情况&#xff0c;所以改用树形下拉&#xff0c;但是element没有相关组件&#xff0c;现记录下vue3js自定义实现可以根据…

Vector - CAPL - CRC算法介绍(续)

不常用CRC算法 目录 Crc_CalculateCRC8H2F 代码示例 Crc_CalculateCRC32P4 代码示例 Crc_CalculateCRC64 代码示例 Crc_CalculateCRC8H2F 功能&#xff1a;根据数据计算CRC8H2F的相应校验和。 data&#xff1a;待计算CRC8H2F校验和的数据 dataSize&#xff1a;待计算CRC…

JVM垃圾收集器与HotSpot的算法细节

目录 HotSpot的算法细节实现 根节点枚举 安全点 安全区域 记忆集与卡表 记忆集 作用 卡表&#xff08;Card Table&#xff09; 卡页&#xff08;Card Page&#xff09; 元素变脏&#xff08;Dirty&#xff09; 写屏障 写屏障 写前屏障&#xff08;Pre-Write Barrie…

【数据结构】顺序表

作者&#xff1a;日出等日落 专栏&#xff1a;数据结构 只有毅力才会使我们成功&#xff0c;而毅力的来源又在于毫不动摇&#xff0c;坚决采取为达到成功所需要的手段。 …

Ceph部署

1. 简介 Ceph是一个高性能、可扩容的分布式存储系统&#xff0c;它提供三大功能&#xff1a; 对象存储&#xff1a;提供RESTful接口&#xff0c;也提供多种编程语言绑定。兼容S3、Swift块存储&#xff1a;由RBD提供&#xff0c;可以直接作为磁盘挂载&#xff0c;内置了容灾机…

代码规范(以后会补充)

目录 为什么要规范代码 不规范的代码有什么特点 ​编辑 不规范的坏处 规范代码是什么样的 如何规范代码 1.代码中不要出现莫名其妙的数字 2.深度嵌套 3.注释 4.避免创建大函数 5.重复代码 6.变量命名 7.函数命名 8.命名时注意动词的使用 9. 常量值所有都大写 10. 避免变…

PMP备考资料:如何掌握PMP应考中的计算题?

计算题总体来说考得非常简单&#xff0c;题量也少&#xff0c;有时候只考3道、4道简单计算。所以这部分内容大家要细心严谨&#xff0c;不要因为粗心而丢掉分数。 01三点估算 通过考虑估算中的不确定性和风险&#xff0c;可以提高活动持续时间估算的准确性。这个概念源自计划…

映射的概念以及用法

映射的概念以及用法前言映射的定义映射的应用前言 在数学里&#xff0c;映射是个术语&#xff0c;指两个元素的集之间元素相互 “对应”的关系&#xff0c;为名词。映射&#xff0c;或者射影&#xff0c;在数学及相关的领域经常等同于函数&#xff0c;函数是从非空数集到非空数…