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