近期使用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简单使用的更多相关文章

  1. JNI的替代者—使用JNA访问Java外部功能接口

    摘自:http://www.cnblogs.com/lanxuezaipiao/p/3635556.html JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Ja ...

  2. Java跨语言调用,使用JNA访问Java外部接口

    1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...

  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. 【C/C++开发】【Java开发】JNI的替代者—使用JNA访问Java外部功能接口

    JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言( ...

  5. JNA的步骤、简单实例以及资料整理

    1.步骤 1.编写dll文件,放入项目的bin目录(在window上是dll文件,在Linux上是so文件,dll和so都是由C程序生成)  2.新建接口继承Library  3.加载对应的dll或者 ...

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

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

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

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

  8. JNA 如何 加载多个 存在依赖的 DLL 库

    JNA 的出现,极大的简化了原有的 JNI 技术.下面是JNA github地址:https://github.com/java-native-access/jna 1. 简单的一个例子: /** S ...

  9. JNA—JNI终结者

    JNA—JNI终结者 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...

随机推荐

  1. CF796A Buying A House 模拟

    Zane the wizard had never loved anyone before, until he fell in love with a girl, whose name remains ...

  2. PHP中SESSION无法获取问题

    近期在看公司老项目,前台可以正常访问,但是后台却无法登录,一直报请求超时,请重新登录!进入服务后发现是有一处SESSION的值无法获取,这就让人很郁闷了,通常SESSION无法使用都是因为没有使用se ...

  3. UVa 11292 勇者斗恶龙(The Dragon of Loowater)

    首先先看一下这道题的英文原版... 好吧,没看懂... 大体意思就是: 有一条n个头的恶龙,现在有m个骑士可以雇佣去杀死他,一个能力值为x的勇士可以砍掉直径不超过x的头,而且需要支付x个金币.如何雇佣 ...

  4. 字符串转LocalTime再转Instant

    LocalTime a= LocalTime.parse("20:13:01"); // LocalTime a= LocalTime.now(); System.out.prin ...

  5. phpstudy+phpstorm配置xdebug

    配置这个xdebug真的是一个很崎岖的过程.首先在网上搜了一下资料~说要下载xdebug对应的版本~然后打印phpinfo之类一堆~结果没有起作用~当时一直就觉得是不是版本不对.然后在群里面问别个给我 ...

  6. hive 全表全字段对比

    select * from ( select max(t1.source) as source ,t1.c1 ,t1.c2 ,t1.c3 ,count(*) as cnt from ( as sour ...

  7. layim和Gatewayworker组合的实时通讯

    今天是第二次重新开发使用layim和Gatewayworker,但是由于第一次没有写文档,导致这一次就跟第一次一样,一头雾水,重新开始看文档研究,导致遇到一个瓶颈,怎么都过不去.所以,以这篇文章开始, ...

  8. Zero Sum Subarray

    Given an integer array, find a subarray where the sum of numbers is zero. Your code should return th ...

  9. 基于webpack的vue项目路径别名

    在vue的项目里,我们可以使用../这样的相对路径的方式引用不同目录的组件: import userinfo from '../../../components/userinfo.vue'; 使用.. ...

  10. ORACLE CBC LATCH 检查

    ###############1.DB meet latch: cache buffers chains event from awr report ,check latch: cache buffe ...