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 ...
随机推荐
- Unity自带IAP插件使用(googleplay)
https://blog.csdn.net/ar__ha/article/details/64439872 Unity Services里的Unity IAP对于IOS和GooglePlay的支付用这 ...
- poj1753(高斯消元解mod2方程组)
题目链接:http://poj.org/problem?id=1753 题意:一个 4*4 的棋盘,初始时上面放满了黑色或白色的棋子.对 (i, j) 位置进行一次操作后 (i, j), (i + 1 ...
- 【规律】Gym 100739L Many recursions
给出a,求递归式g(k)的初始条件g(0); 可以看出来g(a) = 1,从后往前推.写个模拟程序可以看出来其实g(0) = 2^a,那么就是一个简单地快速幂取模问题了. #include <c ...
- std::copy使用方法
推荐2个c++函数库,类定义的资料库: http://en.cppreference.com/w/cpp/algorithm/copy http://www.cplusplus.com/referen ...
- USACO 1.3.6 Ski Course Design[滑雪课程设计]
先说说思路: 这题比上一道坑人的wormholes简单多了!我一看到这题,“XXX设计”,还以为要用到什么dp呢,没想到是水题 用两层循环,第一层循环相差17中的上界,第二层遍历所有的山峰计算答案.并 ...
- Set\HashSet集合为什么能去重(转)
如果想查找一个集合中是否包含有某个对象,大概的程序代码怎样写呢?当发现某个元素与要查找的对对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的信息,否则返回否定的信息.如果是一个集合中 ...
- Python自动化开发学习20-Django的form组件
武沛齐老师的Django的FORM组件:http://www.cnblogs.com/wupeiqi/articles/6144178.html 转自:http://blog.51cto.com/st ...
- Dijkstra算法图文详解
Dijkstra算法 Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不 ...
- 服务器查看外网IP地址和方法
返回IP地址 curl ip..com/ip.aspx curl whatismyip.akamai.com wget -qO - ifconfig.co curl icanhazip.com dig ...
- SoapUI性能测试
之前没发现SoapUI可以做性能测试,自己写了两个简单的例子,体验一下它的测试功能. 一.使用控件顺序执行 测试的框架如上图所示,一个TestCase包含Test Steps(具体的测试步骤),Loa ...