JNA简单使用
近期使用Java开发有关于摄像机接收到数据的上传,因为摄像机处理图像是用C语言实现的,所以开发需要用到JNA,实现JAVA对C语言的回调,因为具体的开发方式官方文档里面有示例,所以本文只是简单的把需要注意的点罗列出来。
一、 定义
JNA提供一些JAVA工具类,在运行期间访问本地库,如dll/so。
二、 数据类型对照表
官方提供的数据参考表完全够用,当使用数据参考时候,注意参考头文件宏定义。
1、常见数据类型对照
Java 类型 | C 类型 | 原生表现 |
---|---|---|
boolean | int | 32位整数 (可定制) |
byte | char | 8位整数 |
char | wchar_t | 平台依赖 |
short | short | 16位整数 |
int | int | 32位整数 |
long | long long, __int64 | 64位整数 |
float | float | 32位浮点数 |
double | double | 64位浮点数 |
Buffer/ [Pointer] | pointer | 平台依赖(32或 64位指针) |
[] (基本类型的数组) | Pointer/array | 32或 64位指针(参数/返回值) |
其他常用:
Java 类型 | C 类型 | 原生表现 |
---|---|---|
String | char* | /0结束的数组 (native encoding or jna.encoding) |
WString | wchar_t* | /0结束的数组(unicode) |
String[] | char** | /0结束的数组的数组 |
WString[] | wchar_t** | /0结束的宽字符数组的数组 |
Structure[] | struct[] | 结构体的数组,邻接内存 |
Callback | (*fp)() | Java函数指针或原生函数指针 |
NativeMapped | varies | 依赖于定义 |
NativeLong | long | 平台依赖(32或64位整数) |
PointerType | pointer | 和 Pointer相同 |
Structure | struct*\ struct | 指向结构体的指针或结构体,都明确指出,后面详细讨论 |
2、C语言部分常用定义,注意dll内的定义。
#define WORD unsigned short
#define DWORD unsigned int
#define LONG int
#define LLONG long
#define INT64 long long
#define LDWORD long
#define BOOL int
三、调用方法
1、简单函数调用
这里使用deSDK.dll,放到工程目录之下。
dll提供接口函数:
BOOL C_Init(LDWORD dwUser);
Java代码声明:
public class getdeSDK{
public interface Function extends Library {
Function Jinit = (Function)Native.loadLibrary("getdeSDK.dll",Function.class);
public boolean C_Init(Nativelong dwUser);
}
}
Java代码调用:
boolean flag = getSDK.Function.Jinit.C_Init(1);
2、回调函数调用
在dll中定义回调函数,使用时候直接继承(implements)java中声明的接口。
Java代码声明
public interface fDataCallBack extends StdCallCallback {
public int invoke(NativeLong dwUser);
}
3、模拟结构体
回调函数参数会出现结构体或者以结构体本身作为其他的结构体的元素存在,判断结构体是以本身传递还是所为指针存在,详细使用看官方文档。
java声明
public static class MYCLASS extends Structure{
//这里写与dll中相对应的变量与常量。
public Nativelong dwUser;
public byte[] dwName;//char数组
}
4、注意事项
枚举(enum)
在dll中使用enum,在java声明中同样使用enum,但要注意的是,在C中直接使用枚举成员可以作为序号来用,而java需要在枚举成员后加ordinal()方法。ByReference与ByValue
public static class ByValue extends MYCLASS implements Structure.ByValue {}
public static class ByReference extends MYCLASS implements Structure.ByReference {}
如果你的Struct实现Structure.ByReference接口,那么JNA认为你的Struct是一个指针。指向C语言的结构体。
如果你的Struct实现Structure.ByValue接口,那么JNA认为你的Struct是值类型,就是C语言的结构体
四、参考资料
1、官方文档:
- JNA使用入门
- 接口描述
- java接口到本地接口的映射
- 使用指针和数组
- 使用结构体和联合
- 使用引用参数
- 定制化类型映射
- 回调、函数指针、闭包
- 动态类型语言支持(JRuby、Jython)
- 平台库
- 直接方法调用(优化)
- 常见问题列表
- 使用注意要点
2、部分博客:
JNA简单使用的更多相关文章
- JNI的替代者—使用JNA访问Java外部功能接口
摘自:http://www.cnblogs.com/lanxuezaipiao/p/3635556.html JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Ja ...
- Java跨语言调用,使用JNA访问Java外部接口
1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...
- 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)需 ...
- 【C/C++开发】【Java开发】JNI的替代者—使用JNA访问Java外部功能接口
JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言( ...
- JNA的步骤、简单实例以及资料整理
1.步骤 1.编写dll文件,放入项目的bin目录(在window上是dll文件,在Linux上是so文件,dll和so都是由C程序生成) 2.新建接口继承Library 3.加载对应的dll或者 ...
- Java JNA (三)—— 结构体使用及简单示例
JNA简介 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna).JNA提供一组Java工具类 ...
- Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例
ByReference类有很多子类,这些类都非常有用. ByteByReference.DoubleByReference.FloatByReference. IntByReference.LongB ...
- JNA 如何 加载多个 存在依赖的 DLL 库
JNA 的出现,极大的简化了原有的 JNI 技术.下面是JNA github地址:https://github.com/java-native-access/jna 1. 简单的一个例子: /** S ...
- JNA—JNI终结者
JNA—JNI终结者 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...
随机推荐
- 转载 MySQL创建表的语句 示例
show variables like 'character_set_client';#查询字符集 show databases;#列出所有的服务器上的数据库alter create database ...
- ceph数据自动均衡程序
声明:程序基于ceph0.94.x制作 前言: ceph数据自动均衡,为了解决新集群搭建完成和添加新的节点后,不同或者相同容量的磁盘上面pg的分布不均衡,导致集群使用率达不到理想的标准 调整前准备: ...
- jmeter-Http信息头管理器
今天遇到的问题是:一个报名接口,用户先要登录后,再去报名.而登录页面:用户名.密码.动态图形验证码,所以不能直接使用jmeter参数传值方法. 测试的时候,需要先登录,获取ticket后,才能去请求下 ...
- 「产品经理全连接系列2」企业如何开展敏捷或DevOps的研发变革
大家好,我是华为云的产品经理 恒少: 作为布道师和产品经理,出差各地接触客户是常态,经常和华为云的客户交流.布道.技术沙龙,但是线下交流,覆盖的用户总还是少数. 我希望可以借线上的平台,和用户持续交流 ...
- cmake相关问题
一.cmake升级 在ubuntu 16.04下面把cmake 由 3.5.1升级到 3.11,具体的流程如下所述. (1) sudo apt-get install build-essential ...
- Oracle 11G R2在用EXP 导出时,空表不能导出解决办法
11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法: 1.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segmen ...
- POJ2828 Buy Tickets(线段树之插队问题)
飞翔 问题是这样的:现在有n个人要买票,但是天黑可以随便插队.依次给出将要买票的n个人的数据信息.包含两项:pos,当前第i号人来了之后他肯定要插入到pos这个位置,如果当前pos无人,那最好了,直接 ...
- 75th LeetCode Weekly Contest Champagne Tower
We stack glasses in a pyramid, where the first row has 1 glass, the second row has 2 glasses, and so ...
- 自定义Razor 标签
1.首先需要一个abstract class WebViewPage<T> ,继承系统的 System.Web.Mvc.WebViewPage<TModel> 再定义一个Web ...
- Photoshop在网页设计中的应用与方法
1.图像局部截取和图像尺寸调整 做网页设计时经常要用到的某张图像一部分,这就需要截取图像的局部.图像局部截取的方法很多,但使用Photoshop操作起来更方便.具体操作步骤如下: (1)在Photos ...