JNA 调用 DLL

JNA(Java Native Access)是一个开源框架,提供了一种无需编写JNI代码就能调用C/C++动态库的方法。通过解析DLL的头文件,创建对应的Java类来实现调用。在实际应用中需要注意32位和64位DLL的函数名差异,并正确映射方法名,保证参数类型和顺序的一致性,以及正确实现回调接口。本文还提到了常见问题和解决方案的链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JNA

JNA 即 Java Native Access,是一个开源框架,是基于JNI做的封装。主要用于调用C或C++的动态库,达到程序需要实现的效果。
与JNI不同,JNI需要根据java生成.h文件,然后生成对应的DLL,这样会破坏原有的动态库或者需要重新封装一次原有的DLL为新的DLL;JNA则只需要知道调用DLL的.h文件,根据头文件中定义的宏、函数等构造对应的java类和对象,实现Java程序调用已知DLL的效果。

实例阐释

现有已知的.h即头文件如下:

TEST_API.h:定义dll提供的方法;

#ifndef _TEST_API_H__
#define _TEST_API_H__

#include "TestEntry.h"

#ifndef TEST_API_EXPORTS 
#define TESTFUN_API _declspec( dllimport )
#else
#define TESTFUN_API _declspec( dllexport )
#endif

#define API_SUCC		                        0    // 成功
#define API_FAIL		                        1    // 失败

typedef int (*TEST_Method1_Evt) (unsigned char code);   // 初始化服务的回调,判断是否成功

typedef int (*TEST_Method2_Evt) (unsigned int code, Test_Struct_Entry info, unsigned char finishFlag);   // 获取所有用户的回调,获取C返回的用户结果

// 定义回调函数指针
typedef struct 
{
	TEST_Method1_Evt     TestMethod1Ack;
	TEST_Method2_Evt	 TestMethod2Ack;
}TESTEVENTS, *PTESTEVENTS;

//初始化服务
extern "C" TESTFUN_API int __stdcall  TEST_OpenService(unsigned int IP,unsigned short Port,PTESTEVENTS events);
                                      
//查看所有用户                    
extern "C" TESTFUN_API int __stdcall  TEST_GetSystemUserAll(unsigned char LoginUser[USER_LEN]);    // 登录的用户,后台用于注册校验,此处测试设置为admin

#endif

TestEntry.h:定义上述函数使用的参数结构

#ifndef _TEST_H__
#define _TEST_H__

#define USER_LEN		30
#define USER_HABBIT_LEN			30
#define USER_COUNT		50

//用户信息
typedef struct Nm_User_ProfileInfo
{
	unsigned char		UserName[USER_LEN];	 // 用户名
	unsigned int		User
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值