自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;
}

  

Java-JNA使用心得2的更多相关文章

  1. Java开发学习心得(二):Mybatis和Url路由

    目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...

  2. Java开发学习心得(一):SSM环境搭建

    目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...

  3. Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27

    Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需 ...

  4. Atitit.java jna 调用c++ dll 的总结

    Atitit.java jna 调用c++ dll 的总结 1. JNA技术解密1 1.1. JNA工作原理1 2. JNA技术难点 Java—C和操作系统数据类型的对应表1 2.1. 1 2.2.  ...

  5. java集合类学习心得

    java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络. 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是集合接 ...

  6. Java JNA (五)—— 释放Memory对象分配的内存

    Java进程的内存包括Java NonHeap空间.Java Heap空间和Native Heap空间. JNA中的Memory对象是从Native Heap中分配空间.但java的GC是针对Java ...

  7. Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例

    ByReference类有很多子类,这些类都非常有用. ByteByReference.DoubleByReference.FloatByReference. IntByReference.LongB ...

  8. Java JNA (三)—— 结构体使用及简单示例

    JNA简介 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna).JNA提供一组Java工具类 ...

  9. Java JNA (二)—— dll回调函数实现

    java调用dll文件需要使用回调函数作为公开函数的参数时,用以下方法实现: 首先,看c++中定义的dll公开函数: typedef void (*ccback)(char *name ,int le ...

  10. Java JNA (一)—— 调用dll

    Java调用C++动态链接库的方式很多,有jnative,jna等.这里介绍如何通过jna的方式调用动态链接库. 调用代码很简单,就是需要注意几个问题. 补充:如dll内部访问配置文件,需将配置文件放 ...

随机推荐

  1. 数据仓库是什么?OLTP和OLAP是什么?

    数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented).集成的(Integrate).相对稳定的(Non-Volatile).反映历史变化(Time Varian ...

  2. 爬虫技术框架——Heritrix

    Heritrix是一个由Java开发的开源Web爬虫系统,用来获取完整的.精确的站点内容的深度复制, 具有强大的可扩展性,运行开发者任意选择或扩展各个组件,实现特定的抓取逻辑. 一.Heritrix介 ...

  3. vos2009如何监听客户行业是否正规

    在对接被叫改写规则中将改写规则由原来0:9150 改为0:9150+自己手机号,这样客户打出话全转接到自己手机上,可以接听客户销售行业:

  4. anaconda和jupyter notebook使用方法

    查看安装的conda版本 conda --version 如果没有安装anaconda,可以从以下链接下载anaconda或者miniconda,两者安装一个就可以了 miniconda大约50M h ...

  5. IIS https绑定主机头方法 [可实现禁止直接通过IP访问及“IIS中绑定多个https(但需要多个IP地址)”]

    步骤: 打开:%systemroot%\SYSTEM32\inetsrv\config\ 打开:applicationHost.config 查找:<binding protocol=" ...

  6. java日期时间Date类

    java.util包提供了Date类来封装当前的日期和时间. Date类提供两个构造函数来实例化Date对象. 第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函数接收一个参 ...

  7. ios 创建自己的.a文件

    1:首先创建个 静态工程(Cocoa Touch Static Library); 方法名字,一定要暴露在.h文件中, 2:分别在模拟器环境和真机环境下 Analyze (shift+command+ ...

  8. BOM编程

    1 BOM编程 1.1 入门 BOM就是浏览器对象模型编程,通过javascript引擎提供的四个浏览器对象,操作浏览器,这叫BOM编程 1.2 window对象(重点) window代表的是一个窗口 ...

  9. Vue路由讲解

    1>router-link和router-view组件 2>路由配置 a.动态路由 import Home from "@/views/Home.vue"; expor ...

  10. MySql客户端远程连接MySql服务器

    设置MySql服务器以接听端口及以绑定IP地址 MySql服务器默认监听3306端口,确定防火墙以开放此端口. 编辑/etc/my.cnf 添加绑定IP地址.bind-address=192.168. ...