当前位置: 首页 > article >正文

java调用c++

VScode 配置java 并且使用JNA调用c++ 动态库

  1. 安装 Java 开发环境

    ​ 安装 JDK官网直接下载就好,推荐镜像下载

     通过网盘分享的文件:jdk-8u144-windows-x64.exe
    

​ 链接: https://pan.baidu.com/s/1Ov9bJkPNnOgcliBL-PSTFQ?pwd=pg43 提取码: pg43

  • ​ 直接安装安装完之后,设置环境变量。

2.安装 VS Code 插件

VS Code 扩展商店 搜索并安装:

  • “Extension Pack for Java”(微软官方)

  • “Java Dependency Viewer”(查看 Java 依赖)

  • “Java Test Runner”(运行测试)

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加 JNA 依赖

下载 JNA 依赖

  • 你需要手动下载

    jna-5.16.0.jar
    
    jna-platform-5.16.0.jar
    
    • 下载地址:JNA Releases
    • 通过网盘分享的文件:java
      链接: https://pan.baidu.com/s/11Ma1uzqtb_Pgg6jzxteYOA?pwd=v9wq 提取码: v9wq
  • *.jar 文件放到 lib/ 目录(相对于项目根目录)。

.vscode/settings.json 添加 java.project.referencedLibraries

{"java.project.referencedLibraries": ["lib/jna-5.16.0.jar","lib/jna-platform-5.16.0.jar"]
}
  • 这样,VS Code 的 Java 插件会将这些 JAR 作为项目的依赖库。
  • 之后你可以在 Java 代码中直接 import com.sun.jna.*;

VS Code 识别 JNA 依赖

  • 重新打开 VS Code,它会自动索引 lib/ 目录的 JAR 依赖。
  • Java Projects 侧边栏,你应该能看到 Referenced Libraries 里面包含 jna-5.16.0.jarjna-platform-5.16.0.jar

在 Java 中调用 C++ 代码

import com.sun.jna.Library;
import com.sun.jna.Native;public interface HelloLibrary extends Library {HelloLibrary INSTANCE = Native.load("hello", HelloLibrary.class);void hello();
}
public class Main {public static void main(String[] args) {HelloLibrary.INSTANCE.hello();}
}

C++代码

#include <iostream>extern "C" {void hello() {std::cout << "Hello from C++ library!" << std::endl;}
}

注意事项:

JNA 能够直接映射 C++ 的基本数据类型,但要注意 匹配 Java 和 C++ 数据类型,否则可能导致 崩溃或数据错误

extern "C" {const char* get_message() {return "Hello from C++";  // ⚠️ 不能返回局部变量!}
}//正确用法
extern "C" {char* get_message() {const char* msg = "Hello from C++";char* buffer = (char*)malloc(strlen(msg) + 1);strcpy(buffer, msg);return buffer;}void free_message(char* ptr) {free(ptr);}
}C++ 申请的内存 必须手动释放,否则会 内存泄漏。
JNA 只能管理 Java 侧的内存,但 C++ 侧必须自己管理。
类别注意事项
基本数据类型确保 Java 和 C++ 类型匹配,否则可能导致数据错误或崩溃。
传递 char\*(字符串)String 适用于 const char*,但 C++ 不能修改。如果 C++ 需要修改字符串,Java 需传递 ByteBufferMemory
C++ 返回字符串C++ 申请的内存必须手动释放,否则 会内存泄漏。不能返回局部变量指针。
传递结构体Java 结构体 必须继承 Structure,并注意 C++ 结构体对齐规则(可能需要 @FieldOrder)。
传递数组JNA 自动传递指针,C++ 端可直接修改数组内容。
传递指针(void\*在 Java 侧使用 Pointer 进行操作,避免类型转换错误。

相关文章:

java调用c++

VScode 配置java 并且使用JNA调用c 动态库 安装 Java 开发环境 ​ 安装 JDK官网直接下载就好&#xff0c;推荐镜像下载 通过网盘分享的文件&#xff1a;jdk-8u144-windows-x64.exe​ 链接: https://pan.baidu.com/s/1Ov9bJkPNnOgcliBL-PSTFQ?pwdpg43 提取码: pg43 ​ 直接安…...

gitlab+jenkins+harbor+k8s安装操作流程之Jenkins

准备环境 一台centos7系统 4C/8G/100G 如果是jenkins2.5以上版本需要centos8以上版本 JDK1.8编译安装(最新版本jdk需要18以上) MAVEN编译安装 GIT编译安装 JDK1.8步骤 tar -zxvf 解压 vim /etc/profile export JAVA_HOME/data/jdk1.8.0_111 export JRE_HOME$JAVA…...

【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】

【机械视觉】C#VisionPro联合编程———【三、加载CogToolBlock工具详解&#xff0c;以及实例】 在VisionPro中&#xff0c;CogToolBlock 是一种容器工具&#xff0c;可以将多个视觉工具&#xff08;如CogBlob、CogPMAlign等&#xff09;组合成一个可复用的流程。通过C#与Visi…...

Android14 串口控制是能wifi adb实现简介

Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb&#xff08;1&#xff09;相关prop属性设置&#xff08;2&#xff09;在设置界面或者 ifconfi…...

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题&#xff1a;启动wsl里的Ubuntu24报错 报错信息&#xff1a; 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件&#xff0c;并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息&#xff0c;请访…...

常用AI工具推荐

AI对话相关 Deepseek https://chat.deepseek.com/ Kimi https://kimi.moonshot.cn/ 豆包 https://www.doubao.com/ 文心一言 https://yiyan.baidu.com/ 腾讯元宝 https://yuanbao.tencent.com 通义千问 https://tongyi.aliyun.com/qianwen/ 图片生成相关 即梦 https://jimen…...

用AI学编程3——Java学习1

一个Java文件&#xff0c; 整理出Java从入门到精通的所有知识点&#xff0c; 给出注释&#xff0c; 给出这样的Java文件 Java 学习整合文件 /*** Java 学习整合文件* 包含 Java 从入门到精通的主要知识点&#xff0c;包括基础语法、面向对象编程、异常处理、集合框架、多线程…...

如何监控 Pod 的 CPU/内存使用率,prometheus+grafana

一、监控 Pod 的 CPU/内存使用率的方法 1. 使用 kubectl top 命令&#xff08;临时检查&#xff09; # 查看所有 Pod 的资源使用率&#xff08;需安装 Metrics Server&#xff09; kubectl top pods --all-namespaces ​ # 查看指定命名空间的 Pod kubectl top pods -n <n…...

云服务器Linux安装Docker

系统要求 Docker 官方建议将 Docker 运行在 Linux系统上&#xff0c;当然也可以在其他平台运行&#xff0c;本篇博客只介绍在 Linux 系统上的安装方法。 Docker 运行在 CentOS7.X 版本以上&#xff0c;本文使用阿里云 ECS 云服务器 CentOS 7.4 版本。 Docker 需要安装在 64 …...

信息安全与网络安全的区别_信息安全与网络安全之差异探析

在当今数字化时代&#xff0c;信息安全与网络安全成为了人们关注的热点话题。尽管这两个概念经常被提及&#xff0c;但它们之间存在着明显的区别。本文旨在探讨信息安全与网络安全的定义、范畴及应对策略&#xff0c;以帮助读者更好地理解和应对相关挑战。 一、定义与范畴的差…...

Express 中 get 参数获取

1. 使用 req.query 获取 URL 查询字符串参数 在 GET 请求中&#xff0c;参数通常以查询字符串的形式附加在 URL 后面&#xff0c;格式为 ?参数名1值1&参数名2值2 。Express 里可通过 req.query 对象获取这些参数。 const express require("express"); const …...

充电桩快速搭建springcloud(微服务)+前后端分离(vue),客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

充电桩管理系统是专为中小型充电桩运营商、企业和个人开发者设计的一套高效、灵活的管理平台。系统基于Spring Cloud微服务架构开发&#xff0c;采用模块化设计&#xff0c;支持单机部署与集群部署&#xff0c;能够根据业务需求动态扩展。系统前端使用uniapp框架&#xff0c;可…...

深度求索(DeepSeek)开源周技术全景与行业影响研究报告

2025年2月24日至28日&#xff0c;中国AI企业深度求索&#xff08;DeepSeek&#xff09;发起了为期五天的“开源周”活动&#xff0c;连续开源五大核心代码库&#xff08;FlashMLA、DeepEP、DeepGEMM、DualPipe、EPLB&#xff09;及分布式文件系统3FS&#xff0c;覆盖AI模型训练…...

设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan

前言 这几年芯片设计行业在国内像坐过山车。时而高亢&#xff0c;时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何&#xff1f; 我谈谈自己观点&#xff1a;芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后&#xff0c;芯…...

串口助手的C#编写以及有人串口服务器USR-DR301的使用

本文介绍C#编写串口程序的要点,串口服务器USR-DR301(RS232转TCP)的使用、以及调试过程中碰到的两个问题: 1). 调用串口报“连到系统上的设备没有发挥作用”. 2). “所有文本框都变成了透明”的异常处理 代码见:https://download.csdn.net/download/qq_34047402/9046713…...

Android中AIDL和HIDL的区别

在Android中&#xff0c;AIDL&#xff08;Android Interface Definition Language&#xff09; 和 HIDL&#xff08;HAL Interface Definition Language&#xff09; 是两种用于定义跨进程通信接口的语言。AIDL 是 Android 系统最早支持的 IPC&#xff08;进程间通信&#xff0…...

【HeadFirst系列之HeadFirst设计模式】第18天之蝇量模式(Flyweight Pattern):优化资源的秘密武器

蝇量模式&#xff08;Flyweight Pattern&#xff09;&#xff1a;优化资源的秘密武器 在软件开发中&#xff0c;当系统需要创建大量相似对象时&#xff0c;内存占用和性能问题就会浮出水面。《Head First 设计模式》介绍了 蝇量模式&#xff08;Flyweight Pattern&#xff09;…...

微信小程序将markdown内容转为pdf并下载

要在微信小程序中将Markdown内容转换为PDF并下载,您可以使用以下方法: 方法一:使用第三方API服务 选择第三方API服务: 可以选择像 Pandoc、Markdown-PDF 或 PDFShift 这样的服务,将Markdown转换为PDF。例如,PDFShift 提供了一个API接口,可以将Markdown内容转换为PDF格式…...

SQL CHAR_LENGTH返回字符串长度的函数

CHAR_LENGTH 是 SQL 中的一个用于返回字符串长度的函数。它计算的是字符串中的字符数&#xff0c;而不是字节数。这在处理多字节字符集&#xff08;如 UTF-8&#xff09;时尤其有用&#xff0c;因为一个字符可能会占用多个字节。 CHAR_LENGTH(string) string 是要计算长度的字…...

sqlserver删除表记录语句,及删除表时清零ID的SQL语句

sqlserver中&#xff0c;删除表中所有记录的语句如下 Delete from tableName 例&#xff0c;删除表logs的所有记录 sqlserver&#xff0c;删除表中所有数据&#xff0c;标识列ID归零&#xff0c;保留表结构的语句 truncate table tableName 例&#xff0c;删除表logs的所…...

求最大公约数问题(信息学奥赛一本通-1207)

【题目描述】 给定两个正整数&#xff0c;求它们的最大公约数。 【输入】 输入一行&#xff0c;包含两个正整数(<1,000,000,000)。 【输出】 输出一个正整数&#xff0c;即这两个正整数的最大公约数。 【输入样例】 6 9 【输出样例】 3 【题解代码】 #include<bits/stdc…...

Vue3中动态Ref的魔法:绑定与妙用

前言 在Vue 3的开发过程中,动态绑定Ref是一项非常实用的技术,特别是在处理复杂组件结构和动态数据时。通过动态绑定Ref,我们可以更灵活地访问和操作DOM元素或组件实例,实现更高效的交互和状态管理。本文将详细介绍如何在Vue 3中实现动态Ref的绑定,并通过实例展示其妙用。…...

Conda常用命令汇总

Conda 是一个流行的包管理器和环境管理工具&#xff0c;广泛应用于数据科学、机器学习等领域。它可以帮助我们管理 Python 包以及不同版本的环境&#xff0c;避免包冲突&#xff0c;提升项目的可复现性。以下是一些常用的 Conda 命令&#xff0c;涵盖环境创建、管理、包安装等常…...

2025年科技趋势深度解析:从“人工智能+”到量子跃迁的技术革命

一、“人工智能”国家战略&#xff1a;重塑产业生态的核心引擎 2025年政府工作报告首次将"人工智能"提升至国家战略层面&#xff0c;标志着AI技术正式成为驱动产业升级的核心力量。据麦肯锡最新研究显示&#xff0c;中国云计算市场规模已突破8315亿元&#xff0c;其…...

【瞎折腾/ragflow】构建docker镜像并部署使用ragflow

说在前面 操作系统&#xff1a;win11docker desktop版本&#xff1a;4.29.0docker engin版本&#xff1a;v26.0.0ragflow版本&#xff1a;nightly 安装docker 官网 如果是win11&#xff0c;backend建议使用wsl2 安装好后打开docker desktop&#xff0c;不然docker命令用不了 …...

哈弗赛恩公式计算长度JavaScript实现

哈弗赛恩公式&#xff08;Haversine formula&#xff09;是一种用于计算球面上两点间最短距离的数学方法&#xff0c;尤其适用于地球表面。本文将详细介绍哈弗赛恩公式的原理、应用以及如何使用JavaScript实现它。 一、哈弗赛恩公式原理 在球面几何中&#xff0c;哈弗赛恩公式…...

Pytest框架中的Fixture:深入理解与实际应用

Pytest是Python中最流行的测试框架之一&#xff0c;以其简洁的语法和强大的功能而闻名。在Pytest中&#xff0c;fixture是一个非常重要的概念&#xff0c;它允许我们在测试函数执行前后进行一些准备工作或清理工作。本文将深入探讨fixture的使用方法、实际应用场景以及一些高级…...

大模型赋能金融行业:从理念到落地实践

思维导图 引言 &#x1f31f; 随着人工智能技术的飞速发展&#xff0c;大模型正在重塑各行各业&#xff0c;金融领域尤为明显。本文将基于业内领先金融科技公司的实践经验&#xff0c;系统探讨大模型在金融行业的落地应用、面临的挑战以及未来的发展方向。从AI发展历程、能力边…...

数据结构篇——串(String)

一、引入 在计算机中的处理的数据内容大致可分为以整形、浮点型等的数值处理和字符、字符串等的非数值处理。 今天我们主要学习的就是字符串数据。本章主要围绕“串的定义、串的类型、串的结构及其运算”来进行串介绍与学习。 二、串的定义 2.1、串的基本定义 串&#xff08;s…...

数据结构--【顺序表与链表】笔记

顺序表 template <class T> class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类 //公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员&#xff0c;受保护成员在 arrList 类中仍然是受保护成员。 { …...