Java通过JNI技术调用C++动态链接库的helloword测试

JNI调用原理

原理就不细说了,其实就是写个库给Java调,可以百度一下Java JNI,下面是HelloWorld代码测试

编写一个本地测试类

package com.my.study.cpp_jni;/*** 测试Java调用C++库* <p>使用命令javac -h . NativeTest.java自动生成C头文件</p>* <p>到jdk中的include\win32下单jni.h和jni_md.h头文件拷过来</p>* <p>实现cpp文件</p>* <p>编译</p>* <p>导入</p>* <p>配置cpp库文件</p>* <p>System.load("D:/xxx/java/com/my/study/cpp_jni/MyLibrary.so");</p>**/
public class NativeTest {static {/*// 设置java.library.path路径System.setProperty("java.library.path", "/path/to/library");// 通过System.loadLibrary()加载库文件System.loadLibrary("mylibrary");*/System.load("D:/xxx/java/com/my/study/cpp_jni/MyLibrary.dll");}private native void print();public static void main(String[] args) {new NativeTest().print();}
}

java文件格式说明

使用JavaC命令生成C语言的头文件.h文件

用命令javac -h . NativeTest.java自动生成C头文件

javac -h . NativeTest.java

生成文件com_my_study_cpp_jni_NativeTest.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_my_study_cpp_jni_NativeTest */#ifndef _Included_com_my_study_cpp_jni_NativeTest
#define _Included_com_my_study_cpp_jni_NativeTest
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_my_study_cpp_jni_NativeTest* Method:    print* Signature: ()V*/
JNIEXPORT void JNICALL Java_com_my_study_cpp_jni_NativeTest_print(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif

com_my_study_cpp_jni_NativeTest.h文件格式说明

拷贝JDK include目录下的jni.h和win32/jni_md.h头文件到相同路径

修改com_my_study_cpp_jni_NativeTest.h文件的#include <jni.h>为#include "jni.h"引入方式,避免查找C/C++库
在这里插入图片描述

NativeTest.cpp实现C头文件函数

#include<iostream>
#include "com_my_study_cpp_jni_NativeTest.h"using namespace std;
JNIEXPORT void JNICALL Java_com_my_study_cpp_jni_NativeTest_print(JNIEnv *, jobject) {cout << "Hello Word JNI" << endl;}

编译C++库文件

编译C源代码并创建本地库

// 编译C语言库
// gcc -ID:\xxx\Java\Java8\jdk\include\ -ID:\xxx\Java\Java8\jdk\include\win32\ NativeTest.c -shared -o MyLibrary.so
// 编译C++库
// g++ -ID:\xxx\Java\Java8\jdk\include\ -ID:\xxx\Java\Java8\jdk\include\win32\ NativeTest.cpp -shared -o MyLibrary.so
// gcc -I 表示将后面的目录表示为第n个头文件的目录

执行测试,报错

在这里插入图片描述

解决错误问题,确认gcc、g++版本是32还是64位

这里不如直接把vs装上测试,因为那个无法找到库文件的问题我弄了几个小时,这里不如直接装上vs,装好vs后几分钟就生成好dll库了
我这里使用VS2022生成动态链接库,装好创建一个C++项目
这里是刚才根据对应头文件和cpp实现文件创建的文件结构,文件都是上面的文件,把文件放到对应位置就行了
在这里插入图片描述

对了这里的pch.h预编译头去掉一下,因为用不到,要不然一直报错
在这里插入图片描述

使用vs生成动态链接库,把生成的代码放到D盘根目录,方便测试,修改一下Java测试代码,这里可以看到我这里使用g++指令生成的动态链接库比使用vs生成的动态链接库小,说明使用指令生成的动态链接库还差了什么东西在里面,我对C++也不熟悉,所以这里使用vs生成了
在这里插入图片描述

/*** 测试Java调用C++库* <p>使用命令javac -h . NativeTest.java自动生成C头文件</p>* <p>到jdk中的include\win32下单jni.h和jni_md.h头文件拷过来</p>* <p>实现cpp文件</p>* <p>编译</p>* <p>导入</p>* <p>配置cpp库文件</p>* <p>System.load("D:/xxx/java/com/my/study/cpp_jni/_013_Cpp_VS_Dynamic_Link_Lib.dll");</p>* <p>System.loadLibrary("_013_Cpp_VS_Dynamic_Link_Lib");//不加dll</p>* Can't load IA 32-bit .dll on a AMD 64-bit platform:需要下载64位cpp编译器,不同cpu编译器不同*/
public class NativeTest {static {System.load("D:/_013_Cpp_VS_Dynamic_Link_Lib.dll");}private native void print();public static void main(String[] args) {new NativeTest().print();}
}

idea运行测试:
在这里插入图片描述
这里可以看到运行了C++编译打印的字符串Hello World JNI,成功了,撒花

总结:

  1. 创建Java文件,函数用native标记
  2. 生成.h头文件
  3. 拷贝jni.h,jni_md.h文件,调整文件引用位置
  4. 实现头文件
  5. 生成动态链接库(这里使用VS)
  6. Java调用

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

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

相关文章

CTFhub-RCE-读取源代码

源代码&#xff1a; <?php error_reporting(E_ALL); if (isset($_GET[file])) { if ( substr($_GET["file"], 0, 6) "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else {…

塑料质量检测是确保产品制造和装配过程的关键环节

激光塑料透光率检测是一种有效的塑料材料特性检测方法。在激光束通过上层透明材料后&#xff0c;被下层材料吸收。上层材料可以是透明的或者是有颜色的&#xff0c;但是必须能够保证有足够的激光通过。 塑料质量检测是确保产品制造和装配过程的关键环节。通过激光塑料透光率检测…

手机地磁传感器与常见问题

在手机中&#xff0c;存在不少传感器&#xff0c;例如光距感&#xff0c;陀螺仪&#xff0c;重力加速度&#xff0c;地磁等。关于各传感器&#xff0c;虽功能作用大家都有所了解&#xff0c;但是在研发设计debug过程中&#xff0c;却总是会遇到很多头疼的问题。关于传感器&…

SPSS时间序列分析:序列图

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

从0到0.01入门React | 006.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

ubuntu上安装edge浏览器

1下载edge浏览器 官网下载 edge浏览器的linux版本可在上面的官网中寻找。 我选择的是Linux(.deb)。 2 安装 可在终端的edge安装包所在的路径下输入下面命令安装。 sudo dpkg -i edge安装包的名称.deb3 安装可能存在的问题 1dpkg:依赖关系问题使得edge-stable的配置工作不…

PSP - 蛋白质复合物结构预测 Template Pair 特征 Mask 可视化

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134333419 在蛋白质复合物结构预测中&#xff0c;在 TemplatePairEmbedderMultimer 层中 &#xff0c;构建 Template Pair 特征的源码&#xff0c…

Elastic Observability 8.11:ES|QL、APM 中的通用分析和增强的 SLOs

作者&#xff1a;Tom Grabowski, Katrin Freihofner, Israel Ogbole Elastic Observability 8.11 引入了 ES|QL for Observability&#xff08;技术预览版&#xff09;、Universal ProfilingTM 和 Elastic APM 集成&#xff0c;以及针对 Elastic Observability 的新 SLO &#…

ZYNQ_project:ram_dual_port

伪双端口ram&#xff1a;写端口&#xff1a;clk_w,en_A,we_A,addr_A,din_A;读端口:clk_r,en_B,addr_B;dout_B. 设计读写模块&#xff0c;写入256个数据&#xff0c;再读出256个数据。 输入时钟100Mhz&#xff0c;输出时钟50Mhz。 多bit数据&#xff0c;高速时钟域到低速时钟…

二十六、W5100S/W5500+RP2040树莓派Pico<WOL示例>

文章目录 1 前言2 简介2 .1 什么是Wake on LAN&#xff1f;2.2 Wake on LAN的优点2.3 Wake on LAN数据交互原理2.4 Wake on LAN应用场景 3 WIZnet以太网芯片4 Wake on LAN示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关…

具名挂载和匿名挂载

匿名卷挂载 &#xff1a; -v 的时候只指定容器内的路径 如下面这个&#xff1a;/etc/nginx 1.docker run -d -P --name nginx -v /etc/nginx nginx 2.查看所有卷 docker volume ls 这里发现&#xff0c;这就是匿名挂载&#xff0c;只指定容器内的路径&#xff0c;没有指定…

平安人寿基于 Apache Doris 统一 OLAP 技术栈实践

导读&#xff1a;平安人寿作为保险行业领军企业&#xff0c;坚持技术创新&#xff0c;以数据业务双轮驱动的理念和更加开放的思路来应对不断增长的数据分析和应用需求&#xff1b;以深挖数据价值、保障业务用数效率为目标持续升级大数据产品体系。自 2022 年起平安人寿开始引入…

某城高速综合管控大数据大屏可视化【可视化项目案例-04】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…

notes_质谱蛋白组学数据分析基础知识

目录 1. 蛋白组学方法学1.1 液相-质谱法1) 基本原理2) bottom-up策略的基本流程 1.2 PEA/Olink 2. 质谱数据分析2.1 原始数据格式2.2 分析过程1&#xff09;鉴定搜索引擎&#xff08;质谱组学&#xff09;重难点/潜在的研究方向 2&#xff09;定量3&#xff09;预处理 2.3 下游…

MySQL 批量修改表的列名为小写

1、获取脚本 SELECT concat( alter table , TABLE_NAME, change column , COLUMN_NAME, , lower( COLUMN_NAME ), , COLUMN_TYPE, comment \, COLUMN_COMMENT, \; ) AS 脚本 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA 数据库名 and TABLE_NAME表名-- 大写是up…

22.斐波那契数列数列前20项.

#include<stdio.h>int main(){int i,sum1; int a[100];a[0]0;a[1]1;for(i2;i<20;i){a[i]a[i-1]a[i-2]; sumsuma[i];}printf("斐波那契数列的前20项和为&#xff1a;%d",sum);return 0;}

【Linux进程】进程控制

目录 一、进程创建 1.2 fork函数初识 1.2 fork函数返回值 1.3 写时拷贝 1.4 fork常规用法 1.5 fork调用失败的原因 二、进程终止 2.1 进程退出场景 2.2 进程退出码 2.2.1 用strerror打印错误信息 2.2.2 errno全局变量 2.3 进程常见退出方法 2.3.1 进程正常退出 2…

eclipse安装lombok插件

lombok插件下载:Download 下载完成&#xff0c;lombok.jar放到eclipse根目录&#xff0c;双击jar运行 运行界面&#xff0c;点击Install安装。 安装完成&#xff0c;重启IDE&#xff0c;rebuild 项目。 rebuild 项目

使用内网穿透实现U8用友ERP本地部署与异地访问

文章目录 前言1. 服务器本机安装U8并调试设置2. 用友U8借助cpolar实现企业远程办公2.1 在被控端电脑上&#xff0c;点击开始菜单栏&#xff0c;打开设置——系统2.2 找到远程桌面2.3 启用远程桌面 3. 安装cpolar内网穿透3.1 注册cpolar账号3.2 下载cpolar客户端 4. 获取远程桌面…

交叉编译 mysql-connector-c

下载 mysql-connector-c $ wget https://downloads.mysql.com/archives/get/p/19/file/mysql-connector-c-6.1.5-src.tar.gz 注意&#xff1a;mysql-connector 的页面有很多版本&#xff0c;在测试过程中发现很多默认编译有问题&#xff0c;其中上面的 6.1.5 的版本呢是经过测…