JNA调用C++的相关点总结

2024-08-22 03:08
文章标签 c++ 总结 调用 相关 jna

本文主要是介绍JNA调用C++的相关点总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近的项目需要使用到Java调用C++写的动态链接库,所以了解了一下实现的方法。期间也踩了不少雷,甚至至今有些还不是很清楚,今天写出来,记录一下, 也希望大神能够给我解决一些未知的地方。
首先,思路是通过C++完成主要的任务处理部分,然后形成一个动态链接库。然后当Java的服务执行到特定条件下面的时候,调用该接口,启动C++的服务。期间,Java会将需要的参数都传递给该接口(参数的传递上面有雷)。

  1. 封装动态链接库
    我们通过下面的例子来封装一个接口。这个接口会需要传递一个数据库。数据的传递,在C++中我们知道可以按照指针的方式、可以采用值传递的方式,也可以采用引用的方式。但是在Java(或者说JNA)中,只有采用值传递(byValue)和引用方式(ByReference)的方式来进行值的传递。对应于C++中的值传递和指针方式。
    我们在封装动态链接库的时候,把这两种方式都封装进去。下面是要使用到的结构体的头文件:
#ifndef _H_STRUC_H
#define _H_STRUC_H////#include <string>struct stu
{char* name;int age;int score;
};#endif

在结构体中,我们装进去一个char指针,两个整型数据。其中的整型数据类型在Java中石油对应的类型。但是char*,尤其是指针类型的数据,在Java中是不存在的(Java中的指针需要使用intPointer?)。通过查找相关的资料,Java中的String类型是对应于char指针指示的字符串的。
上面降到的数据类型的映射关系十分的重要,比如在一开始的时候,我以为Java中的String类型和C++中的std::string是对应的,但是却发现调试的时候会造成Java在调用接口的时候爆出“Invalid memory access”的错误。同样,char*不能够使用具有相似性质的char数组来代替,也会报出错误来。

下面是头文件。

#include "stru.h"
#include <Windows.h>void mesBox(void);extern "C" __declspec(dllexport) void mesBox1(void);extern "C" __declspec(dllexport) void mesBox2(struct stu *st);extern "C" __declspec(dllexport) void mesBox3(struct stu st);extern "C" __declspec(dllexport) void mesBox4(int a);

头文件中需要注意的就是记得带上extern "C" __declspec(dllexport)。前面的extern "C"是能够保障生成和声明的函数名字保持一致。后面部分声明为导出函数。

下面是实现的部分。其实C++部分在头文件确定之后基本上没有什么问题。由于几个函数具有较大的相似性,所以只贴出其中一个。

这篇关于JNA调用C++的相关点总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095064

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静