Java项目调用C/C++ SDK的方案汇总

Java项目调用C/C++ SDK的方案汇总

  • 背景
  • 调研
    • JNI
    • JNative
    • JNA
    • JavaCPP

背景

Java项目中需要调用到一个C++项目,于是对目前通用的解决方案做了一些调研,这里做一个汇总。

调研

JNI

JNI:Java Native Interface,JNI是一套编程接口,用来实现Java代码与本地的C/C++代码进行交互。

流程:

在这里插入图片描述

class文件生成C++头部文件(Test.h)示例,相关命令:

javac -h . MathJniTest.java

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "MathJniTest.h"
/* Header for class MathJniTest *//** Class:     MathJniTest* Method:    add* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_MathJniTest_add(JNIEnv *, jclass, jint x, jint y) {return x + y;}/** Class:     MathJniTest* Method:    sub* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_MathJniTest_sub(JNIEnv *, jclass, jint x, jint y) {return x - y;}
int main(int argc, const char* argv[]){}

关于头部文件的C++实现示例:

#include "Test.h"
/* Header for class MathJniTest *//** Class:     MathJniTest* Method:    add* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_MathJniTest_add(JNIEnv *, jclass, jint x, jint y) {return x + y;}/** Class:     MathJniTest* Method:    sub* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_MathJniTest_sub(JNIEnv *, jclass, jint x, jint y) {return x - y;}
int main(int argc, const char* argv[]){}

缺点&难点:需要对现有的语音SDK进行修改,增加Java编译后的头部文件及C++的实现,在这部分的代码中调用C++对应函数方法,并重新打包SDK

JNative

JNative:基于JNI的进一步封装

官方文档:http://jnative.free.fr/SPIP-v1-8-3/article.php3?id_article=4

下载第三方包(JNative),引入jar及dll(linux下是.so 动态库文件)
调用对应API实现

CJNative.dll为业务实现的dll文件,sub为方法名称

#include <iostream>int sub (int x, int y) {return x - y;}int main()
{int a = sub(1, 3);std::cout << a;return 0;
}
System.setProperty("jnative.debug", "true");System.setProperty("jnative.loadNative","C:\\Windows\\SysWOW64\\JNativeCpp.dll");JNative n3 = null;try {n3 = new JNative("CJNative.dll", "sub");// 设置返回类型n3.setRetVal(Type.INT);// 设置第一个参数值n3.setParameter(0, 1);n3.setParameter(1,8);n3.invoke();System.out.println("例3:outputString = "+n3.getRetVal());} catch (NativeException | IllegalAccessException e) {e.printStackTrace();}

优点:简单易用

缺点:仅支持windows下的32位系统及linux系统,缺乏完善的文档,并且2006年后不再维护

JNA

JNA:同样是JNI的封装升级

官方文档:https://github.com/java-native-access/jna

同样定义好.h 头部文件

#ifndef JNA_TEST_H
#define JNA_TEST_H#ifdef __cplusplus
extern "C"
{
#endif__declspec(dllexport) int sub(int a, int b);#ifdef __cplusplus
}
#endif
#endif //JNA_TEST_H

Java项目中定义好对应的接口,及加载对应的库(windows下为dll文件)

public interface JNAInterface extends Library {JNAInterface INSTANCE = Native.load("D:\\test\\jna\\Jna.dll*",JNAInterface.class);int sub(int a,int b);
}

执行

public static void main(String[] args) {
//        Method[] methods = JNAInterface.INSTANCE.getClass().getDeclaredMethods();
//        for (Method method : methods) {
//            System.out.println(method.getName());
//        }System.out.println(JNAInterface.INSTANCE.sub(1, 3));}

优点:使用简单、文档比较完善且还在持续维护中

JavaCPP

JavaCPP:通过自动生成Java类和本地方法的方式,将C/C++代码包装为Java可调用的接口。

官方文档:https://github.com/bytedeco/javacpp/wiki/Mapping-Recipes

优点:自动生成Java类和本地方法。
缺点:相较于传统JNI,需要修改的业务逻辑 Java 代码会更多,需要考虑内存管理问题。

备注:感觉这个方式还是有一定的上手成本的,而且对于一些C++项目,如果入参和返参是一些很复杂的对象(或指针),转换难度比较大,笔者在实践过程中,碰了很多坑,最终是放弃了。

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

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

相关文章

基于社区电商的Redis缓存架构-库存模块缓存架构(下)

基于缓存分片的下单库存扣减方案 将商品进行数据分片&#xff0c;并将分片分散存储在各个 Redis 节点中&#xff0c;那么如何计算每次操作商品的库存是去操作哪一个 Redis 节点呢&#xff1f; 我们对商品库存进行了分片存储&#xff0c;那么当扣减库存的时候&#xff0c;操作…

PyEcharts快速上手_Python数据分析与可视化

PyEcharts快速上手 导入图表类型添加数据设置图表样式输出图表链式调用 导入图表类型 和其他库的导入方法一样&#xff0c;在绘图之前首先要在文件开头导入所需图表类型。 from pyecharts.charts import BarBar 类型是柱状图/条形图在 pyEcharts 中的英文名。 pyEcharts 中有…

vr工业制造流程3D模拟仿真可视化展示

工业仿真3D数字化展示系统具有多方面的独特之处&#xff0c;主要体现在以下几个方面&#xff1a; 1、真实感和交互性&#xff1a;该系统可以将实际的工业设备、产品、场景等进行数字化建模&#xff0c;通过三维图形技术将其呈现在计算机屏幕上&#xff0c;使用户可以在虚拟环境…

Python中的并发编程

目录 一、引言 二、Python中的线程 1、线程的概念 2、创建线程 3、线程同步和锁 4、线程池 三、Python中的进程 1、进程的概念 2、创建进程 四、Python中的异步IO 1、异步IO的概念 2、异步IO的实现 3、异步IO的并发执行 五、总结 一、引言 并发编程是一种计算机…

【漏洞复现】智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC

漏洞描述 智跃人力资源管理系统是基于B/S网页端广域网平台,一套考勤系统即可对全国各地多个分公司进行统一管控,成本更低。信息共享更快。跨平台,跨电子设备。智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在SQL注入漏洞,攻击者可通过该漏洞获取数据库中的信…

100W用户、8000W流量在线贺卡应用架构如何优化?

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

GOLAND搭建GIN框架以及基础框架搭建

创建GO环境文件夹 终端输入安装GIN go get -u github.com/gin-gonic/gin如果遇到超时错误 package golang.org/x/net/html: unrecognized import path "golang.org/x/net/html": https fetch: Get "https://golang.org/x/net/html?go-get1": dial tcp …

KubeShark: Kubernetes的Wireshark

Wireshark可以帮助我们抓取并分析网络数据包&#xff0c;理解网络中发生的事情&#xff0c;那是否有工具可以帮助我们理解在K8S集群中发生的事情&#xff0c;帮助排查集群故障&#xff0c;Kubeshark就是这样的工具。原文: KubeShark: Wireshark for Kubernetes[1] 简介 Wiresha…

【动态代理详解】

动态代理 知道什么是动态代理以及动态代理能干什么就可以 代理的概述 什么是动态代理 ​ 使用jdk的反射机制&#xff0c;创建对象的能力&#xff0c; 创建的是代理类的对象。 动态&#xff1a;在程序执行时&#xff0c;调用jdk提供的方法才能创建代理类的对象。jdk动态代理&…

【Oracle】数据库登陆错误:ORA-28000:the account is locked解决方法

问题描述 在连接Oracle数据库的时候出现了ORA-28000:the account is locked报错&#xff0c;登录账号被锁定&#xff0c;出现这种情况就需要将被锁定用户解锁。 解决方法 解锁方法就是通过用system账号登录数据库&#xff0c;然后修改被锁定账户状态&#xff0c;具体如下图所示…

51爱心流水灯32灯炫酷代码

源代码摘自远眺883的文章&#xff0c;大佬是30个灯的&#xff0c;感兴趣的铁汁们可以去看看哦~&#xff08;已取得原作者的许可&#xff09;&#xff1a;基于STC89C51单片机设计的心形流水灯软件代码部分_单片机流水灯代码_远眺883的博客-CSDN博客 由于博主是个小菜鸡&#xff…

selenium+python

selenium 八大查找元素 from selenium import webdriver from selenium.webdriver.common.by import By# 创建一个 WebDriver 实例 driver webdriver.Chrome()# 打开网页 driver.get("https://www.baidu.com/")# 使用 find_element 方法查找元素 element driver.…

springboot 整合 Spring Security 上篇

1.创建springBoot 项目工程(spring6.0的底层、JDK17) 1.添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>配置完成启动访问controller会出现登录…

prometheus部署及与grafana结合应用

一、prometheus 介绍 prometheus server 是 Prometheus组件中的核心部分&#xff0c;负责实现对监控数据的获取&#xff0c;存储以及查询。它会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据&#xff0c;当新拉取到的数据大于配置的内存缓存区时&…

绘制彩色正多边形-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第10讲。 绘制彩色正多边形…

论文解读--Visual Lane Tracking and Prediction for Autonomous Vehicles

自动驾驶汽车视觉车道线跟踪和预测 摘要 我们提出了一种用于自动驾驶汽车跟踪水平道路车道标记位置的可视化方法。我们的方法是基于预测滤波的。预测步骤估计在每个新的图像帧中期望的车道标记位置。它也是基于汽车的运动学模型和嵌入式测程传感器产生的信息。使用适当准备的测…

弱网模拟工具

一、背景 一个人晚上在家通过 Wi-Fi 上网&#xff0c;在线电影播放基本流畅&#xff0c;可一旦在晚间用网高峰期打视频电话就画面糊&#xff0c;这时不仅可能带宽受限了&#xff0c;还可能有较高的丢包率。与有线网络通信相比&#xff0c;无线网络通信受环境影响会更大&#x…

【Java Web学习笔记】 1 - HTML入门

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/html 零、网页的组成 HTML是网页内容的载体。内容就是网页制作者放在页面上想要让用户浏览的信息&#xff0c;可以包含文字、图片视频等。 CSS样式是表现。就像网页的外衣。比如&#xff0c;标题字体、…

树基本概念+前中后序遍历二叉树

&#x1f308;一、树的基本概念 ☀️1.树的定义&#xff1a;树是一种非线性结构&#xff0c;看起来像一棵倒挂的树&#xff0c;根朝上&#xff0c;而叶朝下。 ☀️2.相关术语 1.根节点&#xff1a;图中的A&#xff0c;无前驱结点 2.叶节点&#xff08;终端节点&#xff09;&a…

第九节HarmonyOS 常用基础组件4-Button

一、Button Button组件主要用来响应点击操作&#xff0c;可以包含子组件。 示例代码&#xff1a; Entry Component struct Index {build() {Row() {Column() {Button(确定, { type: ButtonType.Capsule, stateEffect: true }).width(90%).height(40).fontSize(16).fontWeigh…