Java通过jni调用C语言函数,IntelliJ IDEA,CLion,动态链接库dll,本地方法,native

news2024/9/29 3:33:38

Java通过jni调用C语言函数

使用的工具

  • IntelliJ IDEA
  • CLion

开始之前的注意事项

  • 确保安装了mingw并配置了环境变量(下载地址:https://udomain.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-win32/sjlj/x86_64-8.1.0-release-win32-sjlj-rt_v6-rev0.7z

新建Java项目并创建本地方法

以int类型整数加减乘除为例:
在这里插入图片描述
代码:

package com.beiyoufamily.utils;

/**
 * @author Yi Dai 484201132@qq.com
 * @since 2023/6/10 11:22
 */

public class IntegerUtils {
    /**
     * 返回两数相加的和
     *
     * @param var1 第一个操作数
     * @param var2 第二个操作数
     * @return 两数之和
     */
    public native int add(int var1, int var2);

    /**
     * 返回两数相减的差
     *
     * @param var1 第一个操作数
     * @param var2 第二个操作数
     * @return 两数之差
     */
    public native int sub(int var1, int var2);

    /**
     * 返回两数相乘的积
     *
     * @param var1 第一个操作数
     * @param var2 第二个操作数
     * @return 两数之积
     */
    public native int mul(int var1, int var2);

    /**
     * 返回两数相除的商
     *
     * @param var1 第一个操作数
     * @param var2 第二个操作数
     * @return 两数之商
     */
    public native int div(int var1, int var2);

}

关键字native表示要调用一个本地方法,通常来说也就是调用c或者c++的结构。

编译Java项目

Build - build project
编译后的项目:
在这里插入图片描述

创建头文件

用cmd或者idea的终端执行命令,先切换到target目录下的classes目录下,然后执行命令:
javah -jni com.beiyoufamily.utils.IntegerUtils 后面这个是你包含native方法的类的全类名。执行之后会得到一个com_beiyoufamily_utils_IntegerUtils.h的c头文件。如图所示:
在这里插入图片描述
打开看了一下,头文件里面就是几个函数
在这里插入图片描述

创建c项目

在这里插入图片描述
在这里插入图片描述

导入c头文件

首先将刚才javah生成的com_beiyoufamily_utils_IntegerUtils.h头文件拷贝到c项目的根目录中
然后将%JAVA_HOME%\include\jni.h%JAVA_HOME%\include\win32\jni_md.h两个文件拷贝到c项目的根目录,这两个文件在哪儿取决于你JAVA_HOME环境变量配置到什么地方的。如图所示的三个文件就是刚才操作的结果:
在这里插入图片描述
上一步操作完了之后可以发现com_beiyoufamily_utils_IntegerUtils.h头文件中#include <jni.h>这一行在报错,修改为:#include "jni.h"就可以了
在这里插入图片描述
在这里插入图片描述

实现C函数

新建一个c源文件,我就起名叫integer_utils.c了,名字可以随意
导入javah生成的那个头文件,并实现头文件里面的方法:
在这里插入图片描述
在这里插入图片描述
代码:

//
// Created by 48420 on 2023/6/12.
//

#include "com_beiyoufamily_utils_IntegerUtils.h"

JNIEXPORT jint JNICALL Java_com_beiyoufamily_utils_IntegerUtils_add
        (JNIEnv *env, jobject obj, jint var1, jint var2) {
    return var1 + var2;
}

JNIEXPORT jint JNICALL Java_com_beiyoufamily_utils_IntegerUtils_sub
        (JNIEnv *env, jobject obj, jint var1, jint var2) {
    return var1 - var2;
}

JNIEXPORT jint JNICALL Java_com_beiyoufamily_utils_IntegerUtils_mul
        (JNIEnv *env, jobject obj, jint var1, jint var2) {
    return var1 * var2;
}

JNIEXPORT jint JNICALL Java_com_beiyoufamily_utils_IntegerUtils_div
        (JNIEnv *env, jobject obj, jint var1, jint var2) {
    return var1 / var2;
}

生成动态链接库

点击CLion的Build - Build project。如果报错,可以尝试先点击一下File - Reload CMake project,然后再次尝试构建
构建完成之后即可看到项目目录下的cmake-build-debug目录下已经有了一个名为:libjni_test.dll的动态链接库。这个库可以改名的,叫什么无所谓,比如我等下把它改名为abc.dll
在这里插入图片描述

在java中加载动态链接库,调用本地方法

调用System.load方法加载刚刚得到的libjni_test.dll动态链接库,System.load的参数是动态链接库的绝对路径

然后调用本地方法:
在这里插入图片描述
当然也可以使用System.loadLibrary方法来加载动态链接库,不过你需要把你的动态链接库拷贝到系统属性java.library.path指定的一个任意目录中,并且不能带扩展名,可以用System.getProperty传入java.library.path获得java.library.path的目录,如图:
在这里插入图片描述
只需要将动态链接库拷贝到这里面的任何一个目录(前提是其他目录中没有重名的动态链接库)即可,比如我放到C:\Program Files\Common Files\Oracle\Java\javapath这个目录中:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【2023】华为OD机试真题Java CC++ Python JS Go-题目0245-信号发射和接收

题目0245-信号发射和接收 题目描述 有一个二维的天线矩阵,每根天线可以向其他天线发射信号,也能接收其他天线的信号,为了简化起见,我们约定每根天线只能向东和向南发射信号,换言之,每根天线只能接收东向或南向的信号。 每根天线有自己的高度anth,每根天线的高度存储在…

软件之禅(五)Input 出场

黄国强 2023/06/12 这篇文章我们引入新的概念&#xff0c;即输入&#xff08;Input&#xff09;。类似 Output &#xff0c;Input 也有多种输入形式。同样我们也需要做个设计&#xff0c;封装后续的变化。继续上代码。 / // 输入类class Input; using InputPtr std::shared_p…

8. 原子操作类

Atomic 翻译成中文是原子的意思。在化学上&#xff0c;我们知道原子是构成一般物质的最小单位&#xff0c;在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候&#xff0c;一个操作一旦开始&#xff0c;就不会被其他线程干…

SIMD加速矩阵运算

一、SIMD指令简介 SIMD的全称叫做&#xff0c;单指令集多数据&#xff08;Single Instruction Multiple Data&#xff09;。最直观的理解就是&#xff0c;向量计算。比如一个加法指令周期只能算一组数&#xff08;一维向量相加&#xff09;&#xff0c;使用SIMD的话&#xff0…

应届生求职个人简历模板(合集)

应届生求职个人简历模板1 基本信息 姓 名&#xff1a; 性别&#xff1a; 婚姻状况&#xff1a; 民族&#xff1a; 户 籍&#xff1a; 年龄&#xff1a; 现所在地&#xff1a; 身高&#xff1a; 联系电话&#xff1a; 电子邮箱&#xff1a;__ 求职意向 希望岗位&#xff1a;Web前…

【建议】强烈推荐ES6函数自由传参的写法,针对方法体的可扩展性很有帮助

let fun({a,b,c}{a:1,b:2,c:3})>{console.log(a);console.log(b);console.log(c); } 接下来我们即可自由传参&#xff0c;需要什么就传递什么 以上写法非常适用于需求变更的情况下自由传递参数&#xff0c;而且形参的数量、传参先后顺序可以根据业务自由搭配&#xff0c;非常…

Feign接口windows启动调用正常,Linux环境调用404

1、Linux环境启动之后报错 如下&#xff1a; windows 是调用正常得 反复测试好几轮 还是这样 &#xff0c;nacos都是注册进去得 helper-service 调用 xTIMS-Web 解决&#xff1a;FeignClient注解 不配置URL会出现那样问题&#xff0c; 配置URL之后 解决 &#xff0c;不报错了…

延迟队列--DelayQueue(JDK)

JDK自身支持延迟队列的数据结构&#xff0c;其实类&#xff1a;java.util.concurrent.DelayQueue。 我们通过阅读源码的方式理解该延迟队列类的实现过程。 1.定义 DelayQueue:是一种支持延时获取元素的无界阻塞队列。 特性&#xff1a; 线程安全&#xff1b; 内部元素有“…

人工智能算力需求稳增,中国将持续夯实算力底座

中国始终强调科技兴国的重要性。数字经济时代&#xff0c;技术的力量更为凸显。近年来&#xff0c;中国政府相关部门相继发布一系列政策&#xff0c;更加明确了人工智能对于提升中国核心竞争力的重要支撑作用&#xff0c;加上新基建、数字经济等持续利好政策的推动&#xff0c;…

0202性能分析-索引-MySQL

1 索引语法 创建索引 CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_column_name,...);Index_name&#xff1a;规范为idx_表名_字段名... 查看索引 SHOW INDEX FROM table_name;删除索引 DROP INDEX index_name ON table_name;按照下列要求&#xff0c;创建…

仿交易猫链接 跳转APP功能

最新仿交易猫假链接&#xff0c;带有跳转APP功能 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

C语言数据结构——循环链表

如果人生会有很长,愿有你的荣耀永不散场。——《全职高手》 一 . 循环单链表 循环单链表是单链表的另一种形式&#xff0c;其结构特点是&#xff0c;链表中最后一个结点的指针域不再是结束标记&#xff0c;而是指向整个链表的第一个结点&#xff0c;从而使链表形成一个环。 和单…

PLC现场安装和维护的注意事项

虽然PLC是专门在现场使用的控制装置&#xff0c;在设计制造时已采取了很多措施&#xff0c;使它对工业环境比较适应&#xff0c;但是为了确保整个系统稳定可靠&#xff0c;还是应当尽量使PLC有良好的工作环境条件&#xff0c; 并采取必要的抗干扰措施。因此&#xff0c;PLC在安…

python中,unicode对象怎么转换成dict?

python中&#xff0c;unicode对象怎么转换成dict&#xff1f; 使用loads两次

「展会前线」易天光通信盛装亮相2023越南通讯展会

2023年6月7日&#xff0c;在历经了忙碌有序的前期准备工作后&#xff0c;易天光通信销售团队带着满满的信心踏上了越南通讯展会之旅&#xff01; “千呼万唤始出来&#xff0c;犹抱琵琶半遮面”。2023年6月8日&#xff0c;各方期待已久的2023越南通讯展会在越南胡志明市正式开…

肠道有害菌属——假单胞菌属(Pseudomonas),多变且适应性强

谷禾健康 假单胞菌属&#xff08;Pseudomonas&#xff09;是最多样化和普遍存在的细菌属之一&#xff0c;其物种存在于沉积物、临床样本、植物&#xff08;或植物根际&#xff09;、患病动物、水、土壤、海洋、沙漠等&#xff0c;这反映在它们多变的代谢能力和广泛的适应环境的…

3款好用的客户系统管理软件推荐,你用过哪款?

进行客户资料管理确实很重要。我本人在工作中也常常遇到客户关系管理的难题&#xff0c;有时候忘记填写客户信息&#xff0c;亦或是填错信息等场景&#xff0c;甚至会造成许多尴尬局面。为了解决这个问题&#xff0c;我也试用了很多个方法来提高效率。下面我想谈一谈我本人在摸…

十肽-4/Decapeptide-10, CG-IDP2——有效逆转皮肤衰老

简介----十肽-4 十肽-4可以穿透真皮增加胶原蛋白&#xff0c;通过从内至外的重建来逆转皮肤老化的过程&#xff1b;刺激胶原蛋白、弹力纤维和透明质酸增生&#xff0c;提高肌肤的含水量和锁水度&#xff0c;增加皮肤厚度以及减少细纹。 功效与应用----十肽-4 抗皱抗衰老 改善…

浪潮 KaiwuDB x 大数据中心 | 数据驱动政府治理能力快速提升

业务背景 我国工业互联网大数据资源存在孤立、分散、封闭等问题&#xff0c;数据价值未能得到有效利用&#xff0c;数据主权和数据安全面临重大威胁。 发挥数据对工业经济的基础支撑和创新引擎作用&#xff0c;可促进工业互联网的创新发展&#xff0c;加速数据驱动政府治理能…

Pycharm中的find usages有什么用?

问题描述&#xff1a;我们经常使用Pycharm作为开发工具&#xff0c;我们右键会发现有个find usages功能。 比如&#xff0c;我们以YOLOv8中的detect/train.py中的DetectionTrainer()类为例&#xff0c;右键之后如下图所示。 答案&#xff1a;全局搜索&#xff0c;查找类、变量…