jna enum 对应 java_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、官方文档:
2、部分博客:
jna enum 对应 java_JNA简单使用相关推荐
- c#中enum的用法小结
转自:http://blog.csdn.net/moxiaomomo/article/details/8056356 enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存 ...
- c enum能像java一样吗_不一样的Java Enum
Emum是在Java5中引入的新特性,从那开始,它被广泛的用在不同的Java应用中,相比于C和C++的Enum,Java的Enum功能更加强大.但是很多开发人员暂时还没意识到它的强大之处,在Enum的 ...
- python中enum_Python如何实现enum
什么是enum,为什么需要它? 枚举类型,也称为enum,是一种数据类型,由一组命名值组成.这些可枚举的命名值充当计算机语言中的常量.例如,COLOR枚举可以包括诸如RED, GREEN, BLUE等 ...
- Android与Swift iOS开发:语言与框架对比
Swift是现在Apple主推的语言,2014年新推出的语言,比 Scala等"新"语言还要年轻10岁.2015年秋已经开源.目前在linux上可用,最近已经支持Android N ...
- Unity教程:如何使用枚举来帮助简化游戏开发
你是否曾经在Unity游戏中工作过,想知道如何为你正在开发的系统创建一个自定义类型?好吧,在这个博客中,我们将回顾什么是枚举,以及如何使用它们.然后我们将使用enums来指定一些UI输入. Enum是 ...
- 4.类型设计规范《.NET设计规范》
类是引用类型的一般情况,占了框架中的大多情况,类的流行归于它支持面向对象的特征,以及它的普遍的适用性,基类和抽象类是两个特殊的逻辑分组,它们与扩张性有关. 由于CLR不支持多继承,接口类型可以用来模拟 ...
- 转-《高性能mysql》并不是一本好书——SQL笔记
转自: https://book.douban.com/review/8122660/ 版权归作者所有,任何形式转载请联系作者. 作者:姚泽源(来自豆瓣) 来源:https://book.douban ...
- Swing透明和变换
以前或许大家对一个UI组件是否透明没有那么关心,但是自从Vista的毛玻璃出现后,UI透明就成了大家非常关注的一个话题,于是Java阵营开始了铺天盖地的讨论如何实现透明的效果,但是很不幸的是无论组件如 ...
- JDK5.0的11个主要新特征
1 泛型(Generic) 1.1 说明 增强了java的类型安全,可以在编译期间对容器内的对象进行类型检查,在运行期不必进行类型的转换.而在j2se5之前必须在 ...
最新文章
- php列表显示教程,Dedecms后台管理文档列表显示自定义字段方法教程
- 如何为项目配置网关并且测试、实战
- OpenGL vs D3D
- 误删Windows文件后恢复技巧
- 第四范式入选Forrester中国机器学习Now Tech™,成唯一AutoML专注类大型厂商
- python命令行工具_python命令行工具Click快速掌握
- Android 第四课 活动的启动模式
- Android逆向笔记-Unity3D逆向一般思路(静态分析)
- 你应该知道的 Linux 命令行技巧
- 关于网页js判断“客户端设备类型是移动端还是PC端“的解决方法?
- IoT 爆发前夕,企业架构要面对哪些变革
- Gremlin发布混沌工程实验平台免费版,开放了“故障即服务”功能
- 半导体八大工艺流程图_深度研究——半导体之光刻胶,看五大龙头谁能迈出国产化第一步?...
- NOIP 2005 等价表达式 (TYVJ P1060)
- 【转载】面对酱紫的情况,肿么办哇?
- 第二届金融交易技术大会拥抱Fin Tech-创新、科技、融合在沪圆满落幕!
- 抢红包算法 c语言版本,抢红包算法实现示例
- 藤子不二雄博物馆之行
- FFmpeg入门详解之122:Qt5 FFmpeg本地摄像头采集预览实战
- NKOJ 2770 难度系数(最小生成树)
热门文章
- python中的替换函数_python:替换模块类中的函数
- 计算机科学考试大纲,计算机科学与技术考试大纲.doc
- dcom配置_spring cloud 二代架构依赖组件 全配置放送
- java调用构造函数中某一个值_Java如何在枚举的构造函数中调用另一个枚举值
- l298n电机驱动模块使用方法_SPDK virtio 驱动模块介绍及使用
- 服务器未对目录服务请求作出响应,ArcGIS Server 站点内部
- 什么是WebSocket,以及如何在Python中使用它?
- python中acosh_acosh()函数以及C ++中的示例
- 开篇词:如何轻松获得 Offer
- 2019 年总结 | 31岁,不过是另一个开始