Java使用JNI实现C文件的调用

news2024/11/15 13:47:04

1.使用IDEA新建工程

构建最基本的maven类型就行,文件结构如下:
在这里插入图片描述

其中最主要的类如下:

package org.linx;

public class TestJNI {
    static {
        /**
         * 加载jni库,有一个重要的点就是生成的为libnative.so,下面加载代码需要消除前缀lib和后缀so
         */
        System.loadLibrary("native");
    }

    //定义naive方法
    public native void sayHello();

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

}

main方法可有可无,只是用来测试的。

2.生成jni头文件

给IDEA做一个额外工具类:
在File-Settings–Tools–External Tools下新建。
在这里插入图片描述

Name和Description随意,Name会在下面用到。重要的的下面三个:

1,Program内容                $JDKPath$/bin/javah
2,Arguments内容				-classpath $OutputPath$ -d ./jni $FileClass$
3,Working directory内容		$ProjectFileDir$

build java项目,在.class上点击鼠标右键—External Tools–GenerateHeader生成头文件,在jni目录就生成org_linx_TestJNI.h的头文件了。(h文件会自动拼接包名,内部方法名会自动拼接Java_包名_类名)

3.手动构建C文件

值得注意的是c文件方法名需要和h文件方法名相同
TestJNI.c文件如下:

#include <jni.h>
#include <stdio.h>
#include "org_linx_TestJNI.h"
JNIEXPORT void JNICALL Java_org_linx_TestJNI_sayHello
(JNIEnv *env, jobject obj)
{
    printf("HelloWorld JNI!/n");
    return;
}

拷贝到jni文件夹下

4.构建出so文件

gcc -shared -fPIC -o libnative.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux TestJNI.c -lc

此时jni文件夹将会有3个文件,.h和.c和.so

5.运行Java文件

不出意外的话应该出意外了,此时可能会出现错误

no ××× in java.library.path

此时有两种解决方法:
方法一:
java代码中输入

System.out.println(System.getProperty("java.library.path"));

此时可以找到java.library.path的路径,将刚才生成的.so文件放进来
方法二:
在IDEA启动的地方选择edit config-add vm options,添加

-Djava.library.path=$ProjectFileDir$/jni

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

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

相关文章

241:vue+openlayers绘制多边形,计算面积值

第241个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayers项目中绘制多边形,通过Polygon的getArea方法,计算出面积。 直接复制下面的 vue+openlayers示例源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共137行)相关API参考专栏目标示…

CSS3 动画 animation 入门学习笔记 之 属性详解

文章目录 简单介绍 CSS 动画CSS 动画的作用CSS 动画语法介绍CSS 动画属性animation-nameanimation-durationanimation-delayanimation-directionanimation-iteration-countanimation-play-stateanimation-timing-functionanimation-fill-modeanimation 简单介绍 CSS 动画 引用…

密码学学习笔记(十二):压缩函数 - Davies–Meyer结构

密码学中压缩函数是指将输入的任意长度消息压缩为固定长度输出的函数。压缩函数以两个特定长度的数据为输入&#xff0c;产生与其中一个输入大小相同的输出。简单来说就是它接受一些较长的数据&#xff0c;输出更短的数据。 压缩函数接收长度为X和Y的两个不同输入&#xff0c;并…

v1.1!最新版Weblogic漏洞利用工具

工具简介 迫于目前现有的weblogic工具没怎么更新、payloay jdk适用版本等问题&#xff0c;所以基于superman18、sp4zcmd等项目&#xff0c;写一个weblogic工具&#xff0c;工具运行版本要求jdk 8&#xff0c;支持漏洞检测、命令执行、内存马注入、密码解密等&#xff08;深信服…

Linux进程理解【进程状态】

Linux进程理解【进程状态】 进程运行时&#xff0c;进程会被CPU调度&#xff0c;但系统中存在多个进程&#xff0c;进程运行的先后顺序等等该怎么保证呢&#xff1f;OS将进程分成了运行、睡眠、休眠、暂停、死亡等几种状态来对进程进行管理&#xff0c;下面我将带大家学习进程…

工作--数组

一、遍历数组 1、filter&#xff1a; 新数组、return、条件表达式 &#xff08;不改变原数组&#xff09; 把满足条件的元素返回给 新数组&#xff0c;filter返回的是新数组 &#xff01;&#xff01;&#xff01;&#xff01; 赋值&#xff0c;会直接覆盖掉原来的值 使用…

react useState useEffect useMemo实际业务场景中的使用

下面的代码实现了上面图片的功能 import React, { useMemo } from "react"; import "./HomeHead.less"; import Img from "../assets/images/timg.jpg";const HomeHead function HomeHead(props) {{ /*父组件传过来的值 */}let { today } pro…

Gabor Filters

Gabor Filters: Manjunath, B. S., & Ma, W. Y. (1996). Texture features for browsing and retrieval of image data. IEEE Transactions on Pattern Analysis and Machine Intelligence, 18(8), 837-842. Gabor滤波器是一种基于Gabor函数的特定频率和方向选择性滤波器。…

Go语言之流指针类型,new函数

计算机中所有的数据都必须放在内存中&#xff0c;不同类型的数据占用的字节数不一样&#xff0c;例如 int 占用 4 个字节。为了正确地访问这些数据&#xff0c;必须为每个字节都编上号码&#xff0c;就像门牌号、身份证号一样&#xff0c;每个字节的编号是唯一的&#xff0c;根…

MySQL-DDL-表结构操作

DDL&#xff08;表操作&#xff09; 表的创建 以具体代码的显示展示如何进行数据表的创建 CREATE DATABASE <数据库名>;CREATE TABLE <表名> (<列名1> <数据类型1> <约束>,<列名2> <数据类型2> <约束>,... ) 具体代码示例&am…

基于Spring Boot的高校专业学习预警系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的高校专业学习预警系统设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java sp…

C++正则表达式校验某个字符串是否是合格的email

C正则表达式校验某个字符串是否是合格的email 可以借助正则表达式校验某个字符串是否是合规的电子邮箱。对于邮箱的正则表达式有严格的模式&#xff0c;如&#xff1a;^[a-zA-Z0-9_&*-](?:\\.[a-zA-Z0-9_&*-])*(?:[a-zA-Z0-9-]\\.)[a-zA-Z]{2,7}$ 对应的C实现如下&a…

测试基础概念及常见开发模型和测试模型

目录 1.需求的概念 2.测试用例 3.什么是BUG 4.软件的生命周期 5.开发模型和测试模型 开发模型 瀑布模型 快速原型模型 螺旋模型 增量模型 敏捷方法 scrum三大角色 测试模型 V模型 W模型 1.需求的概念 衡量软件测试结果的依据—需求 概念&#xff1a;满足用户期…

变量与数据类型

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

互联网未来信任锚点,后量子计算标准与迁移势在必行

作者 | 宋慧 出品 | CSDN 云计算 图片 | 视觉中国 IT、数字化正在深刻改变和加速全行业的效率与创新。不过&#xff0c;互联网的信息通信安全基石——密码学技术仍在使用第一代公钥密码算法&#xff0c;而随着量子计算的产生发展&#xff0c;以离散对数和大数分解这类等价的数…

深入理解网络通信和TCP、IP协议-01

1、网络协议 计算机网络是什么&#xff1f; 随着计算机技术发展&#xff0c;计算机的体积和价格都在下降&#xff0c;之前计算机多用于研究机构&#xff0c;现 阶段逐步进入一般的公司用于办公。原来计算机之间传输数据需要通过软盘等第三方存储介 质进行转存&#xff0c;人们…

【CXL】CXL ATS 介绍

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

《代码随想录》专题:二叉树的遍历

0、二叉树的遍历方式总结 二叉树主要有两种遍历方式 深度优先遍历&#xff1a;先往深走&#xff0c;遇到叶子节点再往回走。广度优先遍历&#xff1a;一层一层的去遍历。 从深度优先遍历和广度优先遍历进一步拓展&#xff0c;才有如下遍历方式 深度优先遍历 前序遍历&#xff…

【网络编程】网络编程核心概念与模式

配套环境 vscode、gcc、ubuntu22.04 概念描述 网络编程的本质 使用操作系统提供的接口函数&#xff0c;使得应用程序具备收发网络数据的能力。 网络接口在代码层面是操作系统提供的函数 应用程序通过网络接口使用操作系统的联网能力 网络编程核心概念 协议&#xff1a;为进…

STM32——led灯的点亮+闪烁+流水灯的实现

文章目录 一、LED点亮1.原理2.寄存器方式--代码3.库函数--代码4.结果展示 二、LED闪烁三、LED流水灯1.代码2.结果展示 一、LED点亮 1.原理 其方式有两种一种是寄存器方式一种是库函数方式&#xff0c;但其原理都是一样的。如原理图所示&#xff0c;与LED相连接的IO口置低电平…