栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java使用JNA与C++动态库交互以及类型对照

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java使用JNA与C++动态库交互以及类型对照

注意事项: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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678413.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号