JNI用法

提示:文章

文章目录

  • 前言
  • 一、背景
  • 二、
    • 2.1
    • 2.2
  • 总结

前言

前期疑问:
本文目标:


一 背景

之前搞过jni,之前是强哥指导搞的,现在感觉又忘了。

今天照着帖子再搞一次。参考帖子:https://blog.csdn.net/youmingyu/article/details/53447118

二 jni实际使用

2.1 查看javac是否安装

使用java -version查看版本

C:\Users>javac -version
javac 1.8.0_262

我认为只要是装了jdk应该就有了javac。

## 2.2 windows下JAVA调用C/C++库

2.2.1 编写java代码

class HelloJNI
{//注意displayHelloJNI()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。这个方法不包括实现,因为我们要用c/c++语言实现它。public native int displayHelloJNI(int a,int b); //声明外部实现函数//注意System.loadLibrary("helloJNILib")这句代码,它是在静态初始化块中定义的,用来装载helloJNILib共享库,这就是我们在后面生成的helloJNILib.dll(假如在其他的操作系统可能是其他的形式,比如Linux下为helloJNILib.so)static {System.loadLibrary("win64/helloJNILib"); //导入本地库}public static void main(String[] args) {System.out.println(new HelloJNI().displayHelloJNI(1,2));}
}

2.2.2 javac生成.class文件

执行javac HelloJNI.java

代码中的注释一部分是我从网页中直接拷贝的,在执行javac HelloJNI.java指令时,会报错如下

C:\Users\\Desktop\HelloJNIPro>javac HelloJNI.java
HelloJNI.java:3: 错误: 编码GBK的不可映射字符//娉ㄦ剰displayHelloJNI()鏂规硶鐨勫0鏄庯紝瀹冩湁涓?涓叧閿瓧native锛岃〃鏄庤繖涓柟娉曚娇鐢╦ava浠ュ鐨勮瑷?瀹炵幇銆傝繖涓柟娉曚笉鍖呮嫭瀹炵幇锛屽洜涓烘垜浠鐢╟/c++璇█瀹炵幇瀹冦??

解决办法:在notepad中——编码——转为ANSI编码——保存

再次执行javac HelloJNI.java可以生成HelloJNI.class文件

2.2.3 javah生成.h文件

执行javah HelloJNI

2.2.4 编写C/C++本地实现代码

#include <jni.h> //导入jni头文件
#include "HelloJNI.h" //导入jni头文件
#include <stdio.h>JNIEXPORT jint JNICALL Java_HelloJNI_displayHelloJNI(JNIEnv *env, jobject obj,jint a,jint b){printf("Hello JNI!\n");int c=a+b;return c;
}

2.2.4 创建vs项目

创建vs项目helloJNILib,新建项目——windows桌面——控制台应用

将上述helloJNI.cpp代码拷贝到工程中,头文件中添加helloJNI.h文件

设置引用文件路径,jni.h在JAVA_HOME/include里面

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

VS 添加include头文件

👉添加工程的头文件目录:

  • 当前工程 -> 右键“属性" -> “配置属性" -> “C/C++” -> “常规" -> “附加包含目录" ==> 添加上该工程的头文件存放目录即可。
  • 修好后改好之后,可能还会出现找不到头文件的提示。将平台改成电脑对应的x64

在这里插入图片描述

修改配置类型为动态库(.dll)

在这里插入图片描述
生成dll动态库文件

在这里插入图片描述

将dll文件拷贝到win64文件夹中,执行java HelloJNI指令可以成功执行
在这里插入图片描述
执行java helloJNI
运行结果
在这里插入图片描述

2.2.5 IDEA中使用dll

比想象中的简单,直接IDEA选中HelloJNI文件夹,直接运行

在这里插入图片描述
至于为什么dll文件需要放在win64文件夹下,是因为这条语句

System.loadLibrary("win64/helloJNILib"); //导入本地库

2.3 linux下JAVA调用C/C++库

windows环境是编译成.dll文件

linux环境下是编译成.so文件

将vs工程下的文件拷贝到linux服务器中,其中增加include文件夹,文件夹中增加jni.h文件和jni_md.h文件。

文件情况如图

在这里插入图片描述

编写makefile文件

CXXFLAGS = -Werror=return-type -std=c++14 -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. \CXX = g++
C = gcc
SRC_DIR = ./
TARGET_DIR = ../build/bin/linux
TARGET_FILE = helloJNI.soSRC_CXX=${wildcard $(SRC_DIR)/*.cpp}
SRC_CC=${wildcard $(SRC_DIR)/*.cc}OBJ=$(SRC_CXX:.cpp=.o)
OBJ_CC=$(SRC_CC:.cc=.o)
CXXFLAGS_ALL = -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -static-libstdc++all:	$(OBJ) $(OBJ_CC)$(CXX) $(CXXFLAGS_ALL) -shared -o $(TARGET_FILE) $(OBJ) $(OBJ_CC) $(LIBS)mkdir -p $(TARGET_DIR)cp $(TARGET_FILE) $(TARGET_DIR)/$(TARGET_FILE)clean:rm -f $(SRC_DIR)/*.orm -f $(TARGET_FILE)rm -f $(TARGET_DIR)/$(TARGET_FILE)%.o: %.cpp$(CXX) $(CXXFLAGS) $*.cpp -o $@

执行make,编译成功

root@0002:~/gdal_0407/helloJNI# make
g++ -Werror=return-type -std=c++14 -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -w -c -shared -o -D__STDC_LIMIT_MACROS -Dlinux -I. -I./include helloJNILib.cpp -o helloJNILib.o
g++ -Wl,-z,relro,-z,now,-z,noexecstack -D_FORTIFY_SOURCE=2 -O2 -s -ftrapv -fPIC -fstack-protector-all -static-libstdc++ -shared -o helloJNI.so .//helloJNILib.o
mkdir -p ../../../build/bin/linux
cp helloJNI.so ../../../build/bin/linux/helloJNI.so

make clean可以清除编译文件。

以上在linux环境下编译so文件成功

三、

3.1


总结

未完待续

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

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

相关文章

前端 接口返回来的照片太大 加载慢如何解决

现象 解决 1. 添加图片懒加载 背景图懒加载 对背景图懒加载做的解释 和图片懒加载不同&#xff0c;背景图懒加载需要使用 v-lazy:background-image&#xff0c;值设置为背景图片的地址&#xff0c;需要注意的是必须声明容器高度。 <div v-for"img in imageList&quo…

交叉熵损失函数介绍

交叉熵是信息论中的一个重要概念&#xff0c;它的大小表示两个概率分布之间的差异&#xff0c;可以通过最小化交叉熵来得到目标概率分布的近似分布。 为了理解交叉熵&#xff0c;首先要了解下面这几个概念。 自信息 信息论的基本想法是&#xff0c;一个不太可能的事件发生了…

openwrt局域网配置多个IP

在局域网配置过程中&#xff0c;若是DHCP服务器关闭&#xff0c;又忘记了配置的ip&#xff0c;将很难访问到路由器重新进行配置。这种情况可以在路由器出厂时做一个备用ip去避免。 1.配置 以下是备用ip的配置方法&#xff0c;以SKYLAB的SKW99 WIFI模组为例进行说明&#xff1…

如何在树莓派安装Nginx并实现固定公网域名访问本地静态站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

LeetCode 59.螺旋矩阵II

LeetCode 59.螺旋矩阵II 1、题目 力扣题目链接&#xff1a;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1…

你想来微软苏黎世混合现实研究中心学习和实习吗?

Microsoft Mixed Reality & AI Lab - Zurich 苏黎世混合现实研发中心简介 微软苏黎世混合现实与人工智能实验室概况 专注于利用计算机视觉绘制和理解环境&#xff0c;识别和跟踪相关物体&#xff0c;并帮助用户执行任务&#xff0c;构建混合现实的未来。该实验室还在探索混…

API接口淘宝开放平台item_get-获得淘宝商品详情API接口根据商品ID查询商品标题价格描述等详情数据

要使用淘宝开放平台的item_get API接口根据商品ID查询商品标题、价格、描述等详情数据&#xff0c;你需要先注册一个KEY账号&#xff0c;然后获取到api_key和api_secret。接下来&#xff0c;你可以使用Python的requests库来调用API接口。 以下是一个示例代码&#xff1a; # c…

网络管理实验二、SNMP服务与常用的网管命令

1 常用的网管命令 1.1 网络状态监视命令 包括以下命令&#xff1a;Ipconfig、ping、nslookup、dig、host ipconfig 作用&#xff1a;用来显示本机所有网卡的基本信息&#xff08;IP、掩码、网关、工作状态&#xff09;&#xff1b;用法&#xff1a;ipconfig展示&#xff1a;…

ExtendSim花生酱加工厂模型

该模型展示了ExtendSim可靠性模块与ExtendeSim离散速率技术相结合的协同作用。 在花生酱加工厂的最初阶段&#xff0c;花生经过烘烤和冷却。冷却后的花生经过热烫或水烫去外皮。这些经过漂白的花生进入过程的混合部分&#xff0c;在研磨机中用盐、葡萄糖和氢化油稳定剂将其粉碎…

如何通过Linux pciehp sysfs接口控制PCIe Slot电源状态?-3

pciehp sysfs接口电源控制与NVME驱动卸载的区别 从NVMe SSD设计本身而言&#xff0c;当通过pciehp sysfs接口对PCIe插槽执行Power Off操作时&#xff0c;由于NVMe SSD作为PCIe设备&#xff0c;其电源供应是直接依赖于所连接的PCIe插槽提供的。当插槽电源被关闭时&#xff0c;会…

死锁检测组件

一、死锁 线程 A 占用资源 1,线程 B 占用资源 2,线程 A 想占用资源 2,线程 B 想占用资源 1,线程 A 占用资源 1 的情况下去申请占用资源 2,线程 B 占用资源 2 的情况下去申请占用资源 1,就会出现互相等待对方释放资源的情况,也就是死锁。 CPU 占用率 100% → 出现死循环或…

国产HMI芯片Model3C ——工业品质价格亲民

工业级芯片相较于消费级芯片&#xff0c;在性能上确实拥有显著的优势&#xff0c;尤其对于带彩屏显示或HMI的产品来说&#xff0c;这种优势表现得尤为突出。 首先&#xff0c;对于带彩屏显示或HMI人机交互的产品来说&#xff0c;高性能的芯片是保证流畅的用户体验和快速响应的…

Spring中的适配器模式

在Spring MVC框架中&#xff0c;适配器模式主要体现在对不同类型的处理器&#xff08;即Controller&#xff09;的统一处理上。Spring MVC通过适配器模式来保证无论Controller的实现方式如何多样化&#xff0c;都能够被DispatcherServlet统一调用和管理。具体使用方式如下&…

如何AI绘画(动漫风格)

绘画描述&#xff1a;一只金毛犬 绘画结果&#xff1a; 如何AI绘画&#xff08;动漫风格&#xff09;&#xff1a; 关注一休哥助手微信公众号 点击小程序按钮打开一休哥助手小程序 切换到我&#xff0c;复制授权码 登录网站&#xff1a;https://www.fudai.fun/drawing&…

leetcode.45题:跳跃游戏II

Leetcode.45题&#xff1a;跳跃游戏II /* 题意的理解&#xff1a; nums[0] 只能跳 1 ~ nums[0]步 依次类推&#xff1a;从nums[0] - nums[n - 1] 最少需要多少步数 nums 2 3 1 1 4 nums[0] 2,初始只能跳 1/2步&#xff0c;如跳1步&#xff0c;达到nums[1] 而nums[1] 3,顾第二…

网络篇01 | 入门篇

网络篇01 | 入门篇 01 各层协议目录[网络篇02 | 应用层 kcp&#xff08;王者荣耀&#xff09;](https://blog.csdn.net/qiushily2030/article/details/135835946)[网络篇03 | 应用层 quic](https://blog.csdn.net/qiushily2030/article/details/136192481)[网络篇04 | 应用层 m…

Stable Diffusion之文生图模型训练

1、数据准备 提前准备好一组相关的照片。 在线的图片处理网站 BIRME - Bulk Image Resizing Made Easy 2.0 (Online & Free) 将图片转成统一大小&#xff0c;支持批量处理&#xff0c;效率高 2、生成提示词 进入stable diffusion webui页面 旧版直接使用 train/proproc…

医院一站式后勤管理系统 processApkUpload.upload 任意文件上传漏洞复现

0x01 产品简介 医院一站式后勤管理系统由南京博纳睿通软件科技有限公司开发的一款基于现代医院后勤管理理念的业务系统,产品结合后勤业务管理特点,通过管理平台将后勤管理业务予以系统化、规范化和流程化,从而形成一套构建于平台之上且成熟完善的后勤管理体系,并可在此体系…

使用阿里云试用Elasticsearch学习:Search Labs Tutorials 搭建一个flask搜索应用

文档&#xff1a;https://www.elastic.co/search-labs/tutorials/search-tutorial https://github.com/elastic/elasticsearch-labs/tree/main/example-apps/search-tutorial Full-Text Search

Excel报表成果展示

采用Excel函数实现数据的快速计算&#xff0c;如下&#xff0c;看似很复杂&#xff0c;实际非常方便。