注意事项:javajdk与C++动态库版本要保持一致,必须都是32位或者64位的
相关jar包Maven引用:目前5.4.0版本够用,没必要使用最新
net.java.dev.jna
jna
5.4.0
net.java.dev.jna
jna-platform
5.4.0
在resources目录下创建两个目录,分别放linux系统版本和win系统版本的C++动态库,
linux-x86-64目录放linux系统64位的C++动态库文件,C++linux版动态库文件是.so后缀,
win32-x86-64目录放win系统64位的C++动态库文件,C++win版动态库文件是.dll后缀,
加载C++动态库并编写函数:根据C++的头文件(.h文件)创建对应的java接口类
package com.hk.pimg.jna.dynamic;
import com.hk.pimg.jna.callback.DeviceCallback;
import com.hk.pimg.jna.structure.*;
import com.hk.pimg.jna.utils.JnaLoadUrl;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.*;
public interface HKNetDeviceSDK extends Library {
//相关依赖库加载,库文件log.dll,调用Native.load的时候文件名不带后缀
HKNetDeviceSDK INSTANCElog = (HKNetDeviceSDK) Native.load("log", HKNetDeviceSDK.class);
//主库加载,库文件HKNetDeviceSDK.dll,调用Native.load的时候文件名不带后缀
HKNetDeviceSDK INSTANCE = (HKNetDeviceSDK) Native.load("HKNetDeviceSDK", HKNetDeviceSDK.class);
Boolean hk_discovery_init(PointerByReference p_h, DeviceCallback.DISCOVERY_CB_FUNC p_func, Pointer p_user);
Boolean hk_discovery_send_inquiry(Long h);
Boolean hk_discovery_stop(PointerByReference p_h);
}
java其他类调用函数:
//广播发现初始,只执行一次
//创建回调实现类
HKNetDeviceSDK.INSTANCE.hk_discovery_init(discoveryHandle,discovery_cb_func,null);
//从广播句柄引用取值并转换为long类型指针
long handle = Pointer.nativevalue(discoveryHandle.getValue());
//发送广播
HKNetDeviceSDK.INSTANCE.hk_discovery_send_inquiry(handle);
简单的jna加载动态库以及函数调用例子,实际很复杂,整个项目用到了jna的回调,结构体,结构体数组等复杂的使用方式,初步使用jna会搞不清C++的参数类型与jna参数类型的转换,下面我写下我自己的一些经验后续我用过的类型都会慢慢补充进去:入参就是java传递数据给C++,出参就是java接收C++传递的数据
| C++参数类型 | 使用场景 | java参数类型 |
| char | 出参/入参 | byte |
| char* | 出参 | byte[] |
| 入参 | byte[]/String | |
| const char* | 一般都是入参 | String |
| int | 入参 | int |
| int* | 出参 | IntByReference |
| unsigned int | 入参 | int |
| unsigned int* | 出参 | IntByReference |
| short | 入参 | short |
| short* | 出参 | ShortByReference |
| unsigned short | 入参 | short |
| unsigned short* | 出参 | ShortByReference |
| float | 入参 | float |
| float* | 出参 | FloatByReference |
| unsigned float | 入参 | float |
| unsigned float* | 出参 | FloatByReference |
| bool | 入参 | Boolean |
| 出参 | ||
| void* | 入参 | Pointer |
| void** | 入参 | PointerByReference |



