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;
}
Java-JNA使用心得2的更多相关文章
- Java开发学习心得(二):Mybatis和Url路由
目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...
- Java开发学习心得(一):SSM环境搭建
目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...
- 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)需 ...
- 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. ...
- java集合类学习心得
java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络. 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是集合接 ...
- Java JNA (五)—— 释放Memory对象分配的内存
Java进程的内存包括Java NonHeap空间.Java Heap空间和Native Heap空间. JNA中的Memory对象是从Native Heap中分配空间.但java的GC是针对Java ...
- Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例
ByReference类有很多子类,这些类都非常有用. ByteByReference.DoubleByReference.FloatByReference. IntByReference.LongB ...
- Java JNA (三)—— 结构体使用及简单示例
JNA简介 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna).JNA提供一组Java工具类 ...
- Java JNA (二)—— dll回调函数实现
java调用dll文件需要使用回调函数作为公开函数的参数时,用以下方法实现: 首先,看c++中定义的dll公开函数: typedef void (*ccback)(char *name ,int le ...
- Java JNA (一)—— 调用dll
Java调用C++动态链接库的方式很多,有jnative,jna等.这里介绍如何通过jna的方式调用动态链接库. 调用代码很简单,就是需要注意几个问题. 补充:如dll内部访问配置文件,需将配置文件放 ...
随机推荐
- 数据仓库是什么?OLTP和OLAP是什么?
数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented).集成的(Integrate).相对稳定的(Non-Volatile).反映历史变化(Time Varian ...
- 爬虫技术框架——Heritrix
Heritrix是一个由Java开发的开源Web爬虫系统,用来获取完整的.精确的站点内容的深度复制, 具有强大的可扩展性,运行开发者任意选择或扩展各个组件,实现特定的抓取逻辑. 一.Heritrix介 ...
- vos2009如何监听客户行业是否正规
在对接被叫改写规则中将改写规则由原来0:9150 改为0:9150+自己手机号,这样客户打出话全转接到自己手机上,可以接听客户销售行业:
- anaconda和jupyter notebook使用方法
查看安装的conda版本 conda --version 如果没有安装anaconda,可以从以下链接下载anaconda或者miniconda,两者安装一个就可以了 miniconda大约50M h ...
- IIS https绑定主机头方法 [可实现禁止直接通过IP访问及“IIS中绑定多个https(但需要多个IP地址)”]
步骤: 打开:%systemroot%\SYSTEM32\inetsrv\config\ 打开:applicationHost.config 查找:<binding protocol=" ...
- java日期时间Date类
java.util包提供了Date类来封装当前的日期和时间. Date类提供两个构造函数来实例化Date对象. 第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函数接收一个参 ...
- ios 创建自己的.a文件
1:首先创建个 静态工程(Cocoa Touch Static Library); 方法名字,一定要暴露在.h文件中, 2:分别在模拟器环境和真机环境下 Analyze (shift+command+ ...
- BOM编程
1 BOM编程 1.1 入门 BOM就是浏览器对象模型编程,通过javascript引擎提供的四个浏览器对象,操作浏览器,这叫BOM编程 1.2 window对象(重点) window代表的是一个窗口 ...
- Vue路由讲解
1>router-link和router-view组件 2>路由配置 a.动态路由 import Home from "@/views/Home.vue"; expor ...
- MySql客户端远程连接MySql服务器
设置MySql服务器以接听端口及以绑定IP地址 MySql服务器默认监听3306端口,确定防火墙以开放此端口. 编辑/etc/my.cnf 添加绑定IP地址.bind-address=192.168. ...