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.mfbz.cn/a/212344.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某60区块链安全之Create2实战一学习记录

区块链安全 文章目录 区块链安全Create2实战一实验目的实验环境实验工具实验原理实验内容Create2实战一 实验步骤分析合约源代码漏洞Create2实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约Create2引发的漏洞及其利用 找到合约漏洞进行分析并形成利用 实…

基于SpringBoot + vue的在线视频教育平台

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

肖sir__mysql之视图__009

mysql之视图 一、什么是视图 视图是一个虚拟表&#xff08;逻辑表&#xff09;&#xff0c;它不在数据库中以存储形式保存&#xff08;本身包含数据&#xff09;&#xff0c;是在使用视图的时候动态生成。 二、视图作用 1、查询数据库中的非常复的数据 例如&#xff1a;多表&a…

微信支付/

微信支付准备工作 3.2.1 如何保证数据安全&#xff1f; 完成微信支付有两个关键的步骤&#xff1a; 第一个就是需要在商户系统当中调用微信后台的一个下单接口&#xff0c;就是生成预支付交易单。 第二个就是支付成功之后微信后台会给推送消息。 这两个接口数据的安全性&#x…

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

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

区块链媒体:Web3.015个方法解析-华媒舍

Web3.0是第三代互联网的发展阶段&#xff0c;相较于Web2.0&#xff0c;它具有更高的可信性、安全性和去中心化特点。在Web3.0时代&#xff0c;推广变得更为重要&#xff0c;因为吸引用户和提高品牌知名度对于在竞争激烈的市场中脱颖而出至关重要。本文将揭秘推广Web3.0的15个秘…

Mysql安全之基础合规配置

一、背景 某次某平台进行安全性符合型评估时&#xff0c;列出了数据库相关安全选项&#xff0c;本文特对此记录&#xff0c;以供备忘参考。 二、安全配置 2.1、数据库系统登录时的用户进行身份标识和鉴别&#xff1b; 1&#xff09;对登录Mysql系统用户的密码复杂度是否有要…

CSS3 修改滚动条样式

上图&#xff1a; 上代码&#xff1a; /* 修改垂直滚动条 */ .right-list::-webkit-scrollbar {width: 2px; /* 修改宽度 */height: 5px; /* 修改高度 */ } /* 修改滚动条轨道背景色 */ .right-list::-webkit-scrollbar-track {background-color: #f1f1f1; } /* 修改滚动条滑块…

2023-12-03 LeetCode每日一题(可获得的最大点数)

2023-12-03每日一题 一、题目编号 1423. 可获得的最大点数二、题目链接 点击跳转到题目位置 三、题目描述 几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#x…

吴恩达《机器学习》11-1-11-2:首先要做什么、误差分析

一、首先要做什么 选择特征向量的关键决策 以垃圾邮件分类器算法为例&#xff0c;首先需要决定如何选择和表达特征向量 &#x1d465;。视频提到的一个示例是构建一个由 100 个最常出现在垃圾邮件中的词构成的列表&#xff0c;根据这些词是否在邮件中出现来创建特征向量&…

【MATLAB】mlptdenoise分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 MLPT Denoise是一种基于小波变换的信号分解算法&#xff0c;可以将信号分解为多个具有不同频率特性的小波分量&#xff0c;并对每个小波分量进行频域分析。它基于最大似然参数调整&#…

Fiddler抓包工具之fiddler设置弱网测试

弱网测试 概念&#xff1a;弱网看字面意思就是网络比较弱&#xff0c;我们通称为信号差&#xff0c;网速慢。 意义&#xff1a;模拟在地铁、隧道、电梯和车库等场景下使用APP &#xff0c;网络会出现延时、中断和超时等情况。 Fiddler弱网测试流程&#xff1a; 一、限速操作…

PTA结构体经典编程题

目录 第一题&#xff1a;计算平均成绩 第二题&#xff1a;平面向量加法 第三题&#xff1a;查找书籍 第四题&#xff1a;通讯录排序 第五题&#xff1a;计算职工工资 第一题&#xff1a;计算平均成绩 思路&#xff1a;看到一个学生的基本信息&#xff0c;所以定义一个结构…

12.二维字符数组——输出basic和BASIC

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为二维字符数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 输出basic和BASIC 二、题目分析 法一&#xff1a; for(i0;i<1;i){ for(j0;j<6;j){ putchar(a[i][j]); pri…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《市场环境下运行的光热电站子系统容量优化配比研究》

这个标题涉及到对市场环境下运行的光热电站子系统进行容量优化配比的研究。让我们逐步解读&#xff1a; 市场环境下运行的光热电站&#xff1a; 这指的是光热电站在实际市场环境中的运行&#xff0c;可能包括了市场相关的经济、政策、竞争等因素。 子系统&#xff1a; 光热电站…

【Vue2】Vue的介绍与Vue的第一个实例

文章目录 前言一、为什么要学习Vue二、什么是Vue1.什么是构建用户界面2.什么是渐进式Vue的两种开发方式&#xff1a; 3.什么是框架 三、创建Vue实例四、插值表达式 {{}}1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中2.语法3.错误用法 五、响应式特性1.什么是响…

docker+jmeter+influxdb+granfana

centos7国内阿里源安装docker 1、安装必要的系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2添加官方仓库 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposudo sed -i sdownload.doc…

微服务实战系列之Redis

前言 云淡天高&#xff0c;落木萧萧&#xff0c;一阵西北风掠过&#xff0c;似寒刀。冬天渐渐变得更名副其实了&#xff0c;“暖冬”的说法有点言过其实了。——碎碎念 微服务实战系列之Cache微服务实战系列之Nginx&#xff08;技巧篇&#xff09;微服务实战系列之Nginx微服务实…

2024年,Rust和Go学哪个更好?

Rust vs. Go&#xff0c;在2024年&#xff0c;应该选择哪一个&#xff1f;或者说应该选择哪种语言——GoLang还是Rust。这可能是许多程序员在选择语言时考虑的一个问题。选择理想的编程语言被视为在这个不断变化的环境中取得成功的重要抉择。 GoLang和Rust是当今使用的最年轻的…

【机器学习】简单认识监督学习

简单认识监督学习 ⭐️Supervised learning⭐️Examples⭐️Specific example⭐️两种类型的监督学习算法&#x1f319;回归算法&#x1f319;分类算法 ⭐️总结 Hi~大家好呀&#xff01;经历了暑假期间短暂的接触机器学习的一些算法&#xff0c;之后又对深度学习、yolo系列有些…
最新文章