• Java-JNA使用心得2


    自5月初第一次尝试使用Java封装调用C的dll之后,已经先后经历了3次小项目了。

    上月末是最近的一次项目实际,任务来的急时间又少,还好在加班加点后还是完成了任务,并把第二次没有实现的功能给实现了(C的SDK获取到图片后由Java从内存中取出保存到本地)。

    时间已经过去快1个月了,现把当初“攻克”的小难题给记录一下。

    现讲一下当时的状态,这个C的SDK是相机的SDK,使用账户密码登录相机,并注册一个回调,当相机有抓拍之后会触发回调函数,然后Java把数据从SDK中取出保存。

    之前一直没搞定的是Java通过SDK返回的图片指针把图片从内存中取出保存,这次趁着这个小项目而好好研究了一番。

    实现关键代码如下:

    1、先是SDK中返回数据的结构体

    typedef struct tagPhotoHandler
    {
    	CHAR *apcData[PIC_NUM];		//图片数据的指针数组
    	ULONG aulDataLen[PIC_NUM];	//每张图片的数据长度
    	...
    }
    

      

    2、然后是Java对这个结构体的封装

    public static class tagPhotoHandler extends Structure
    {
    	public static class ByReference extends myStructur implements Structure.ByReference{}
    
    	public ByteByReference[] apcData = new ByteByReference[PIC_NUM];
    	public int[] aulDataLen = new int[PIC_NUM];
    	...
    }
    

      

    3、Java通过指针去内存中取数据

    tagPhotoHandler.ByReference tumph = new tagPhotoHandler.ByReference();
    ByteByReference[] picData = tumph.apcData;
    Pointer p = picData[i].getPointer();
    Byte[] image = p.getByteArray(0,tumph.aulDataLen[i]);
    

      

    4、其他一些较实用的东西

    Pointer pConfig = new Memory(length);
    //指针转结构体
    public static <T extends Structure> T pointer2Structure(Pointer pParam,Class<T> res)
    {
    	T Param;
    	Param = res.newInstance();
    	Pointer facePointer = Param.getPointer();
    	facePointer.write(0,pParam.getByteArray(0,Param.size()),0,Param.size());
    	Param.read();
    	return Param;
    }
    

      

  • 相关阅读:
    C++异常第二篇---C++标准库异常类exception的使用
    C++异常(exception)第一篇--综合讲解
    libconfig第二篇----两个小例子
    libconfig第一篇———使用指南
    log4cxx第三篇----使用多个logger
    kafka第五篇
    kafka第四篇--快速入门(如何使用kafka)
    UVA 455(最小周期)
    UVA1584(环状序列)
    UVA1583(最小生成元)
  • 原文地址:https://www.cnblogs.com/kumu/p/7696524.html
Copyright © 2020-2023  润新知