Java通过jna调用c++动态库

news2024/12/24 2:18:33

1、pom文件添加jna依赖

          <dependency>
                <groupId>net.java.dev.jna</groupId>
                <artifactId>jna</artifactId>
                <version>5.14.0</version>
            </dependency>

2、注意问题

要实现Java调用C++的动态库,需要使用"extern C"关键字。该关键字是C++之父在设计C++时,为兼容已存在的大量C代码而设定的方法。用该关键字将C++的函数包含起来,即可将C++按C语言的方式进行编译。

3、验证环节  没有extern C的c++文件  文件名 cplus2.cpp

#include<stdio.h>
int sayCplus()
{
    printf("Hello, C++\n");
    return 0;
}

4、c++代码头文件    文件名cplus.h

#ifndef _CPLUS_H_
#define _CPLUS_H_

int sayCplus();

#endif

5、g++编译代码 cplus.h和cplus2.cpp需在同一个文件夹下

g++ -shared -o mycpp2.dll cplus2.cpp

生成动态库 mycpp2.dll文件,吧该文件放到 C:\Windows\System32 目录下

6、java代码调用, mycpp2.dll 动态库加载  

package com.pojo.util;


import com.sun.jna.Library;
import com.sun.jna.Native;

public interface MyCpp2 extends Library {
    // 加载mycpp2.dll
    MyCpp2 INSTANCE = (MyCpp2) Native.load("mycpp2", MyCpp2.class);

    int sayCplus();

}

具体调用 和报错信息

package com.pojo.util;

public class MyCppTest {

    public static void main(String[] args) {
//        int num = MyCpp.INSTANCE.sayCplus();
//        System.out.println(num);
        int num2 = MyCpp2.INSTANCE.sayCplus();
        System.out.println(num2);

    }
}

报错信息

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'sayCplus': 找不到指定的程序。

7、正确做法 c++代码添加  extern "C" 修改如下 文件cplus.cpp 如下

#include<stdio.h>
extern "C"
{
int sayCplus()
{
    printf("Hello, C++\n");
    return 0;
}
}

8、cplus.h文件内容不变

9、编译成 mycpp.dll动态库

g++ -shared -o mycpp.dll cplus.cpp

生成动态库 mycpp.dll文件,吧该文件放到 C:\Windows\System32 目录下

10、java代码调用,动态加载 mycpp.dll

package com.pojo.util;


import com.sun.jna.Library;
import com.sun.jna.Native;

public interface MyCpp extends Library {
    // 加载 mycpp.dll
    MyCpp INSTANCE = (MyCpp) Native.load("mycpp", MyCpp.class);

    int sayCplus();

}

具体调用和调用结果

package com.pojo.util;

public class MyCppTest {

    public static void main(String[] args) {
        int num = MyCpp.INSTANCE.sayCplus();
        System.out.println(num);
//        int num2 = MyCpp2.INSTANCE.sayCplus();
//        System.out.println(num2);

    }
}

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

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

相关文章

Script-server: 一款开源的脚本管理工具,为你的Python脚本提供一个直观的 Web UI

在日常工作中&#xff0c;我们经常会使用各种脚本来自动化任务&#xff0c;提升效率。但传统的脚本管理方式往往伴随着一些困扰&#xff1a;复杂的命令行操作、难以理解的脚本参数、缺乏直观的反馈等等。这些问题&#xff0c;让原本应该便捷的脚本管理变得繁琐。 Script-server…

Qt-QWidget的focusPolicy属性(20)

目录 描述 相关API 使用 描述 这里引入了焦点的概念&#xff0c;这个很重要&#xff0c;也是伴随后面介绍中的一个很重要的概念 拿魔兽世界来举例&#xff0c;如下我们在操作兵种的时候&#xff0c;需要先选中单位&#xff0c;然后才能对这些单位进行命令的下达 这一点在笔…

[极客大挑战 2019]Http

1、访问题目链接 2、查看页面源码发现一个Secret.php的跳转页面 3、访问Secret.php发现页面有提示&#xff0c;它说它不是来自这个网页 4、抓包修改来源 添加&#xff1a;Referer: https://Sycsecret.buuoj.cn 发送查看响应 5、修改User-Agent为&#xff1a;Syclover 6、添加X-…

Catia的插件不能调用CAA 的API问题

今天到客户实施Catia二开软件&#xff0c;发现在客户的电脑上调用CAA的API出现调用失败的问题。 根据经验&#xff0c;想到大概是用户电脑上的Catia授权有问题&#xff0c;但是Catia的一大堆授权中需要哪些授权呢&#xff0c;最后花了半天的时间使用二分法测试出&#xff0c;C…

产线工控安全之防勒索病毒杀手锏

在当今数字化时代&#xff0c;数据安全已成为企业运营中不可或缺的一部分。勒索病毒和内部泄密事件的频发&#xff0c;使得企业必须采取更为严格的安全措施来保护其关键数据和运营系统。苏州深信达网络科技推出的MCK主机加固解决方案&#xff0c;正是为了应对这些挑战而设计的。…

十三、创建Uss血条样式

一、控制StyleSheet 1、点击左上角USS文件&#xff08;创建&#xff09; 2、双击style里面的黄色progress-bar 3、在USS文件夹中添加代码实现 4、在主UI上有一个margin&#xff08;外&#xff09;和padding(里) 在Spacing中进行修改 5、只有文字可以在这里进行修改 6、在Atrib…

车载以太网之SOME/IP

整体介绍 SOME/IP(全称为:Scalable service-Oriented MiddlewarE over IP),是运行在车载以太网协议栈基础之上的中间件,或者也可以称为应用层软件。 ​发展历程 AUTOSAR 4.0 - 完成宝马SOME/IP消息的初步集成;AUTOSAR 4.1 - 支持SOME/IP-SD及其发布/订阅功能;AUTOSAR 4.…

自动驾驶相关的理论基础

本文主要参考论文《基于计算机视觉和深度学习的自动驾驶方法研究_白辰甲》&#xff0c;记录一些理论知识。 自动驾驶定义 自动驾驶是指车辆通过传感器感知周围环境&#xff0c;在没有人为干预的情况下&#xff0c;实时改变驾驶行为&#xff0c;完成驾驶任务。 基于计算机视觉…

在树莓派上构建和部署 Node.js 项目

探索在Raspberry Pi上构建和部署Node.js项目的最佳实践。通过我们的专业提示和技巧&#xff0c;克服常见挑战&#xff0c;使您的项目顺利运行。 去年圣诞节&#xff0c;我收到了一份极其令人着迷的礼物&#xff0c;它占据了我许多周末的时间&#xff0c;甚至让我夜不能寐。它就…

SpringBoot打包部署,打包成jar和war有所不同?

1. 我的一个springboot项目&#xff0c;用mvn install打包成jar&#xff0c;换一台有jdk的机器就直接可以用java -jar 项目名.jar的方式运行&#xff0c;没任何问题&#xff0c;为什么这里不需要tomcat也可以运行了&#xff1f; 2. 然后我打包成war放进tomcat运行&#xff0c;…

云服务器部署DB-GPT项目

本文收录于《DB-GPT项目》专栏&#xff0c;专栏总目录&#xff1a; 点击这里。 文章目录 项目介绍 一、登录云服务器 1. 进入控制台 2.点击容器实例&#xff08;点数字&#xff09; 二、创建容器实例 1. 等待容器实例创建好&#xff0c;创建好的容器实例如下&#xff1a;…

多个微信是怎么进行管理的?

随着微信逐渐成为企业商务沟通的重要平台&#xff0c;对于业务咨询量较大的行业&#xff08;例如教育培训、旅游、美容以及医疗等&#xff09;而言&#xff0c;在利用微信进行营销活动和客户服务的过程中&#xff0c;往往会遭遇多微信管理的困境。 在此情形下&#xff0c;选用工…

fwt变换模板

在算法竞赛中&#xff0c;FWT 是用于解决对下标进行位运算卷积问题的方法。 公式&#xff1a; 1.ij|k(j,k相或等于i) void Or(ll * a, ll type) { // 迭代实现&#xff0c;常数更小 for (ll x 2; x < n; x << 1) { ll k x >> 1; …

C++ 在项目中使用Git

目录 一&#xff1a;配置邮箱和姓名 二&#xff1a;生成SSH Key 三&#xff1a;git 工作区和状态 四&#xff1a;git log 常用法 五&#xff1a;git diff 常用法 六&#xff1a;git 分支操作 七&#xff1a;git 回溯分支 八&#xff1a;git rebase -i 压缩历史提交…

UML之类图详解

犬余&#x1f436; “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 零、什么是类图 类图&#xff08;Class Diagram&#xff09;是面向对象系统建模中最常用和最重要的图&#xff0c;它通过图形化的方式展示系统中的…

数学建模笔记—— 蒙特卡罗法

数学建模笔记—— 蒙特卡罗法 蒙特卡罗法1. 模型原理2. 常见问题2.1 圆周率问题2.2 三门问题 蒙特卡罗法 1. 模型原理 提出&#xff1a; 蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”的成员S.M.乌拉姆和J.冯诺依曼首先提出。数学家冯诺依曼…

《磊落轶荡 情寄菱花》——曹大铁先生书画文献展盛大开幕

出席文献展相关领导嘉宾合影 值2024年9月10日曹大铁先生诞辰108 周年之际&#xff0c;《磊落轶荡 情寄菱花》——曹大铁先生书画文献展在常熟市工人文化宫隆重揭幕。该展由曹大铁先生文学艺术弘扬、传承、研究的机构、国内外艺术名家、专家、收藏家、亲属等倡议&#xff1b;该…

芯片杂谈 -- 常聊的内核包含哪些模块

目录 1. R52内核速览 2. 处理器模块详解 3.内核的功能安全测什么&#xff1f; 4.小结 最开始接触到汽车MCU大都来自NXP、Infineon、Renesas&#xff0c;例如MPC5748、TC275、RH850 P1X等等&#xff1b; 而各大OEM、供应商等等发布的JD通常都会要求熟悉AURIX、PowerPC、G3K…

智能客服的演变:从传统到向量数据库的新时代

国产数据库的发展在21世纪初取得了显著的进展。根据不完全统计&#xff0c;目前在国内已有超过300种不同的数据库在案。这一现象在40年前几乎是不可想象的&#xff0c;标志着中国在数据库领域取得了巨大的突破和多样化选择。对于对老一辈的故事或数据库发展史充满兴趣的朋友们&…

从gerrit上拉取未合入的代码工程

一. 简介 本文简单学习一下&#xff0c;如何将 gerrit上未合入的代码拉取到本地。 二. 从gerrit上拉取未合入的代码工程 有时候本地的代码经过 自动化编译通过&#xff0c;提交到 gerrit上&#xff0c;但是有时候在代码实现上还需要做一些更改。这时候就需要从 gerrit上将这…