jna中的结构体指针地址传递

C接口函数定义:

/**********************************************************************
* 函数名称:AhcltSdk_GetResInfoByUsedType
* 功能描述:根据设备用途类型获取资源信息
* 输入参数:u32LogiId:登录ID u8DevUsedType:设备用途类型ID(E_AH_SDK_DEV_USED_TYPE) 
* 输出参数:ptInfo:资源信息数组指针
            pu32Size:资源信息实际个数
* 返 回 值:错误码
***********************************************************************/
AHCLT_SDK_API UINT32 HOWCALL AhcltSdk_GetResInfoByUsedType(UINT32 u32LogiId, UINT8 u8DevUsedType, OUT T_AH_SDK_RES_INFO** ptInfo, OUT UINT32 *pu32Size);

C结构体定义:

// 资源信息
typedef struct
{
    CHAR szObjID[AH_SDK_MAX_ID_LEN];                                        // 对象ID
    UINT8 au8UniqueID[AH_SDK_MAX_UNIQUE_ID_LEN];                  // 唯一序列号(用于HiBus防区扩展模块)
    UINT8 u8UsedType;                                                                 // 用途类型 E_AH_SDK_DEV_USED_TYPE
    UINT8 u8MainType;                                                                 // 主类型 E_AH_SDK_DEV_MAIN_TYPE
    UINT8 u8SubType;                                                                   // 子类型 E_AH_SDK_DEV_SUB_TYPE
    UINT8 u8DefAreaType;                                                            // 防区类型 E_AH_SDK_DEFAREA_TYPE
    UINT8 u8BelongSubSysNo;                                                     // 从属子系统编号   
    UINT32 u32LkgSubSysMask;                                                   // 关联子系统掩码 
    UINT16 u16ObjNo;                                                                    // 防区号/输出号/键盘号
}T_AH_SDK_RES_INFO;

JNA结构体T_AH_SDK_RES_INFO定义:

public class T_AH_SDK_RES_INFO extends Structure {
	/**
	 * \u5bf9\u8c61ID<br>
	 * C type : CHAR[(13)]
	 */
	public byte[] szObjID = new byte[13];
	/**
	 * \u552f\u4e00\u5e8f\u5217\u53f7(\u7528\u4e8eHiBus\u9632\u533a\u6269\u5c55\u6a21\u5757)<br>
	 * C type : UINT8[(8)]
	 */
	public byte[] au8UniqueID = new byte[8];
	/**
	 * \u7528\u9014\u7c7b\u578b E_AH_SDK_DEV_USED_TYPE<br>
	 * C type : UINT8
	 */
	public byte u8UsedType;
	/**
	 * \u4e3b\u7c7b\u578b E_AH_SDK_DEV_MAIN_TYPE<br>
	 * C type : UINT8
	 */
	public byte u8MainType;
	/**
	 * \u5b50\u7c7b\u578b E_AH_SDK_DEV_SUB_TYPE<br>
	 * C type : UINT8
	 */
	public byte u8SubType;
	/**
	 * \u9632\u533a\u7c7b\u578b E_AH_SDK_DEFAREA_TYPE<br>
	 * C type : UINT8
	 */
	public byte u8DefAreaType;
	/**
	 * \u4ece\u5c5e\u5b50\u7cfb\u7edf\u7f16\u53f7<br>
	 * C type : UINT8
	 */
	public byte u8BelongSubSysNo;
	/**
	 * \u5173\u8054\u5b50\u7cfb\u7edf\u63a9\u7801<br>
	 * C type : UINT32
	 */
	public int u32LkgSubSysMask;
	/**
	 * \u9632\u533a\u53f7/\u8f93\u51fa\u53f7/\u952e\u76d8\u53f7<br>
	 * C type : UINT16
	 */
	public short u16ObjNo;
	public T_AH_SDK_RES_INFO() {
		super();
	}
	protected List<? > getFieldOrder() {
		return Arrays.asList("szObjID", "au8UniqueID", "u8UsedType", "u8MainType", "u8SubType", "u8DefAreaType", "u8BelongSubSysNo", "u32LkgSubSysMask", "u16ObjNo");
	}
	/**
	 * @param szObjID \u5bf9\u8c61ID<br>
	 * C type : CHAR[(13)]<br>
	 * @param au8UniqueID \u552f\u4e00\u5e8f\u5217\u53f7(\u7528\u4e8eHiBus\u9632\u533a\u6269\u5c55\u6a21\u5757)<br>
	 * C type : UINT8[(8)]<br>
	 * @param u8UsedType \u7528\u9014\u7c7b\u578b E_AH_SDK_DEV_USED_TYPE<br>
	 * C type : UINT8<br>
	 * @param u8MainType \u4e3b\u7c7b\u578b E_AH_SDK_DEV_MAIN_TYPE<br>
	 * C type : UINT8<br>
	 * @param u8SubType \u5b50\u7c7b\u578b E_AH_SDK_DEV_SUB_TYPE<br>
	 * C type : UINT8<br>
	 * @param u8DefAreaType \u9632\u533a\u7c7b\u578b E_AH_SDK_DEFAREA_TYPE<br>
	 * C type : UINT8<br>
	 * @param u8BelongSubSysNo \u4ece\u5c5e\u5b50\u7cfb\u7edf\u7f16\u53f7<br>
	 * C type : UINT8<br>
	 * @param u32LkgSubSysMask \u5173\u8054\u5b50\u7cfb\u7edf\u63a9\u7801<br>
	 * C type : UINT32<br>
	 * @param u16ObjNo \u9632\u533a\u53f7/\u8f93\u51fa\u53f7/\u952e\u76d8\u53f7<br>
	 * C type : UINT16
	 */
	public T_AH_SDK_RES_INFO(byte szObjID[], byte au8UniqueID[], byte u8UsedType, byte u8MainType, byte u8SubType, byte u8DefAreaType, byte u8BelongSubSysNo, int u32LkgSubSysMask, short u16ObjNo) {
		super();
		if ((szObjID.length != this.szObjID.length)) 
			throw new IllegalArgumentException("Wrong array size !");
		this.szObjID = szObjID;
		if ((au8UniqueID.length != this.au8UniqueID.length)) 
			throw new IllegalArgumentException("Wrong array size !");
		this.au8UniqueID = au8UniqueID;
		this.u8UsedType = u8UsedType;
		this.u8MainType = u8MainType;
		this.u8SubType = u8SubType;
		this.u8DefAreaType = u8DefAreaType;
		this.u8BelongSubSysNo = u8BelongSubSysNo;
		this.u32LkgSubSysMask = u32LkgSubSysMask;
		this.u16ObjNo = u16ObjNo;
	}
	public T_AH_SDK_RES_INFO(Pointer peer) {
		super(peer);
	}
	public static class ByReference extends T_AH_SDK_RES_INFO implements Structure.ByReference {
		
	};
	public static class ByValue extends T_AH_SDK_RES_INFO implements Structure.ByValue {
		
	};
}

JNA接口转换定义:

int AhcltSdk_GetResInfoByUsedType(int u32LogiId, byte u8DevUsedType, PointerByReference ptInfo, IntByReference pu32Size);

JNA调用代码:

IntByReference channelnum = new IntByReference();    //通道资源个数
channelnum.setValue(0);

PointerByReference p = new PointerByReference();
int intResult = sdkLibrary.INSTANCE.AhcltSdk_GetResInfoByUsedType(loginid.getValue(),(byte)1, p, channelnum);

//用于获取结构体长度
T_AH_SDK_RES_INFO tmpInfo = new T_AH_SDK_RES_INFO();
int size = tmpInfo.size();

if(intResult == 0){
    T_AH_SDK_RES_INFO[] channellist = new T_AH_SDK_RES_INFO[channelnum.getValue()];//通道资源列表
    for(int i =0 ; i < channelnum.getValue(); i++) {
        //动态定位结构体指针位置
        channellist[i] = new T_AH_SDK_RES_INFO(p.getPointer().getPointer(0).share(i * size));

        //读取指针地址的内容到结构体
        channellist[i].read();
    }

    //通知sdk释放内存
    sdkLibrary.INSTANCE.AhcltSdk_DestroyResInfoList(p);
}

JNA版本:4.5.1

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值