Java调用C++的DLL设计!!!解耦实用!!!

问题背景:Java调用C++,通常推荐用JNI(Java Native Interface)http://t.csdnimg.cn/kjOND

但是调用时每调用一个C++方法都需要在Java程序中增加,不符合设计时的开放封闭原则,业务一边程序就要修改

public class CallCPlus extends CallImp {
    @Override
    public void execute() {

    }
    public native void test(String url);
    static {
        System.load("C:\\Users\\111\\Desktop\\flowable\\ruoyi-flowable-plus-0.8.X\\ruoyi-flowable-plus-0.8.X\\ruoyi-flowable\\src\\main\\java\\com\\ruoyi\\flowable\\external\\CPlus\\Call.dll");
    }
}

 

解决方法:利用Python作为中间桥梁Bridge

1.Java调用Python

public void callpython(String interpreter, String py_url, String args,String methodName,String returnType){

        Process proc;
        String[] cmds = new String[]{interpreter, py_url,args,methodName,returnType};
        try {
            proc = Runtime.getRuntime().exec(cmds);// 执行py文件
            //用输入输出流来截取结果
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            proc.waitFor();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

2.Python调用C++ 

def callCPlus(methodName,args,returnType,source):
    pDll = CDLL(source)

    # 获取解析的参数
    Arr=parseArgs(args)

    # 获取指定方法名的函数指针
    myfun = getattr(pDll, methodName)

    #参数类型
    myfun.argtypes = Arr[1]

    # 返回值类型
    myfun.restype = parseReturn(returnType)

    #调用 C++ 函数,将参数值解压出来,类似于js中的...

    result=myfun(*Arr[0])

    print(result)

注明:方法名、参数、返回值和dll路径这些函数元数据存放至注册中心(数据库)中

解决了:需要增添方法时,只需将方法的元数据注册到注册中心,无需修改程序

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

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

相关文章

基于springboot+vue的社区医院信息平台系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

计算机毕业设计 | SpringBoot+vue 社区老人健康管理系统(附源码)

1,绪论 对于目前的中国来讲,人口老龄化日益严重,目前最新统计数据表明,60岁以上老人所占的人口比例已达到接近20%。这给我们国家带来了严重的养老压力,同时也严重削弱了我们人力大国的人力优势。对于这些老年人来讲&a…

Github 不能访问,提示:port 22: Connection timed out

问题描述 github clone 代码出现错误: $ git clone gitgithub.com:Atlan4/Fnirsi1013D.git Cloning into Fnirsi1013D... ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository.Please make sure you ha…

2024最新防泄密软件推荐,防泄密软件有哪些功能

今天公司发生一件大事: 竟然会发生泄密事件!!! 针对这种事情,作为企业管理者,需要提高警惕,不但要解决好已经发生的事,平时也要做好预防工作。 如何做好企业防泄密工作?…

Spring Security 之 表单登录

表单登录 Spring Security提供了支持通过HTML表单提供用户名和密码。本节详细介绍了Spring Security中表单身份验证的工作原理。 本节将介绍Spring Security中的基于表单的登录工作原理。首先,我们将看到用户如何被重定向到登录表单。 第1步,用户首先对其未经授权的资源(/…

【nowcoder】链表的回文结构

牛客题目链接 链表的回文结构 /* struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {} };*/ #include <cstdlib> // 建议大伙自己对照我的代码画下图&#xff0c;假设A链表是&#xff1a;1 2 3 2 1 class PalindromeList { publi…

小程序系列--11.小程序自定义组件

一、组件的创建与引用 1. 创建组件 2. 引用组件 3. 局部引用组件 4. 全局引用组件 5. 全局引用 VS 局部引用 6. 组件和页面的区别 二、样式 1. 组件样式隔离 2. 组件样式隔离的注意点 3. 修改组件的样式隔离选项 4. styleIsolation 的可选值 三、数据、方法和属性 1…

初识“操作系统“(Operator System)

概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;文件管理&#xff0c;驱动管理&#xff09; 其他程序&#xff08;例如函数库&#xff…

【教程】如何在苹果手机上查看系统文件?

​ 目录 引言 用户登录工具和连接设备 查看设备信息&#xff0c;电池信息 查看硬盘信息 硬件信息 查看 基带信息 销售信息 电脑可对手机应用程序批量操作 运行APP和查看APP日志 IPA包安装测试 注意事项 引言 苹果手机与安卓手机不同&#xff0c;无法直接访问系统文件…

webpack常用配置

1.webpack概念 ​ 本质上&#xff0c;webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个 依赖图(dependency graph)&#xff0c;然后将你项目中所需的每一个模块组合成一个或多个 …

Kruise Rollout 全链路灰度实践

作者&#xff1a;旦酱、十眠 什么是全链路灰度&#xff1f; 在发布应用的过程中&#xff0c;我们通常希望用少量特定流量来验证新版本的发布是否正常&#xff0c;以保障整体稳定性。这个过程被称为灰度发布。关于灰度发布&#xff0c;我们通过逐步增加发布的范围&#xff0c;…

如何快速解决局域网IP冲突问题?连接IP地址冲突如何用代理IP搞定?

随着互联网的普及&#xff0c;局域网已经成为了许多家庭和企业中不可或缺的一部分。然而&#xff0c;局域网中的IP地址冲突问题却时常困扰着用户。一旦出现IP地址冲突&#xff0c;网络连接就会变得不稳定&#xff0c;甚至无法正常上网。那么&#xff0c;如何快速解决局域网IP冲…

《Linux系列》Linux虚拟机,LVM逻辑卷扩容,xfs文件系统扩容

Linux虚拟机&#xff0c;LVM逻辑卷扩容&#xff0c;xfs文件系统扩容 1 虚拟机配置介绍 在创建虚拟机的时候只给了20G磁盘空间大小&#xff0c;但是现在需求变更&#xff0c;想要增加到40G磁盘空间大小&#xff0c;所以需要通过两步扩容磁盘空间。 系统版本是Centos7 根目录…

掼蛋功能之识别性格篇

常说&#xff1a;千人千面。大多数人一到牌局的场面&#xff0c;往往精神便会放松&#xff0c;面貌神情不再收敛&#xff0c;一言一行体现出的性格暴露无疑&#xff0c;具体表现为以下几种&#xff1a; 1、浮躁冲动型&#xff1a;此类人多数不讲究团队配合&#xff0c;自顾自出…

了解云工作负载保护:技术和最佳实践

云工作负载是指云环境中的应用程序或存储元素&#xff0c;无论是公共云、私有云还是混合云。每个云工作负载都使用云的资源&#xff0c;包括计算、网络和存储。 云工作负载可以多种多样&#xff0c;例如运行应用程序、数据库或托管网站。它们可以是静态的或动态的&#xff0c;…

数据的跃动之美:探索ECharts动态排序柱状图的魔力

前言 在 echarts 中&#xff0c;动态排序柱状图是一种常用图表&#xff0c;可以帮助我们更好地理解数据的变化和排序规律。本文将介绍如何使用 echarts 库创建动态排序柱状图&#xff0c;以展示数据的变化趋势和排序情况。 完整代码 <template><div class"acros…

Java 数据结构集合

文章目录 Java 数据结构1. 基本数据结构1.1 数组 (Array)1.2 链表 (Linked List)1.3 栈 (Stack)1.4 队列 (Queue)双向队列优先级队列 2. 树形数据结构2.1 二叉树 (Binary Tree)2.2 堆 (Heap) 3. 散列数据结构3.1 哈希表 (Hash Map)3.2 LinkedHashMap3.3 TreeMapConcurrentHashM…

Cesium for Unity包无法加载

太上老君急急如律⚡令⚡ &#x1f959;关闭UnityHub&#x1f9c0;启动梯子&#x1f96a;cmd 启动UnityHub &#x1f959;关闭UnityHub &#x1f9c0;启动梯子 &#x1f96a;cmd 启动UnityHub 把批处理启动文件&#x1f448;中的exe的路径换成自己的安装目录&#xff01;保存…

[完美解决]Vue/React项目运行时出现this[kHandle] = new _Hash(algorithm, xofLen)

问题出现的原因 出现这个问题是node.js 的版本问题&#xff0c;因为 node.js V17开始版本中发布的是OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制&#xff0c;可能会对生态系统造成一些影响。故此以前的项目在使用 nodejs V17以上版本后会报错。而github项目…

redis报错:WRONGTYPE Operation against a key holding the wrong kind of value

这个是在redis存取的数据时&#xff0c;存数据时的数据类型和取数据时的数据类型不一致导致的 原因分析 首先需要明白的是&#xff0c;出现这种错误的原因是因为我们在取值的时候&#xff0c;使用的命令不对&#xff0c;比如你用获取string类型的get命令去取列表list类…