引言

新系统起步,带领两个可爱的小组员李宜衡、潘佳琦一起学习、讨论、编码。

系统中使用了JNA调用C++代码。

之前对这项技术也只是听说过,也没用到过。

以前帮同学调试过调用百度地图SDK一个地图项目,那个项目中就用到了百度地图提供的.so文件(动态链接库,Linux下为.so,Windows下为.dll),只是当时用的时候是直接调百度封装好的代码,也没有手动调用的机会。

clipboard.png

参考潘老师给出的示例代码,再配合他人的博客,一步步完成功能。感谢开源,感谢如此之多热爱分享技术的人。

本文可能有些枯燥,但JNA的例子好像也举不出什么有意思的。

JNA

C++

在学校学过C++,也不陌生了,但是当我打开头文件时,才发现,原来我学的不叫C++!(考高分有什么用呢?)

C++太伟大了,甚至连它的设计者都不敢说能完全掌握C++。

clipboard.png

其实去看看我们平常使用的类,原来我们和C++息息相关。

clipboard.png

JDK中就有一些使用C++实现的原生方法。

C++的好处不必说,就是快。目前对性能要求很高的主流系统会采用C++或Go作为开发语言。

这里我们使用并不是因为性能,而是需要通过调用动态链接库来使用已经编写好的基础服务。

JNA

Java Native Access,拥有4600多Star的流行项目,我们可以使用其进行使用Java对C++的访问。

clipboard.png

Github地址:JNA – Github

这个README写的挺好的,就是太枯燥了(至少我是看着看着就困了),如果是首次接触的话,不建议通过README来入门。可以去看看有关这方面的博客,虽然年代久远,但质量都是非常高的。

映射

JNA最大的难点就是:C++和Java的数据类型不同,如何在两种语言之间进行映射。

public interface CLibrary extends Library {

CLibrary INSTANCE = Native.loadLibrary(“PSA5″, CLibrary.class);

}

编写接口,继承Library,然后加载动态链接库获取INSTANCE,该接口就与动态链接库进行了映射。

结构体映射

看了好多篇文章,找到了一种算是被大多数开发者推崇的写法:

继承Structure表示映射结构体:

public class HostStruct extends Structure {

public static class ByReference extends HostStruct implements Structure.ByReference {

}

public static class ByValue extends HostStruct implements Structure.ByValue {

}

public byte[] name = new byte[33];

public int context;

@Override

protected List getFieldOrder() {

return Arrays.asList(“name”, “context”);

}

}

这里有两个和我们平常开发不同的地方:

1.为什么属性是public的?

这个也没找到原因,最开始使用private和get、set去映射时,一直报错,具体记不清了,应该是类似字段找不到的错误。应该是private的框架访问不到。

2.这两个内部类是干什么的?

一个ByReference,一个ByValue,应该能猜到,实现ByReference接口表示该类映射结构体的指针类型(指向结构体的指针),实现ByValue接口表示该类映射结构体的值类型(就是结构体)。

所以实际使用的并不是HostStruct,而是他的两个内部类。

例子

某方法在头文件中如此声明:

typedef PSA_STATUS (*LPFN_PSA_RebootHost)( IN PSA_HOST *psa_host );

映射为如下的接口方法:

NativeLong _PSA_RebootHost(HostStruct.ByReference host);

小坑

文档中的数据类型的表示非常好的,就是有一个缺陷,关于char *的问题。

经过StackOverflow的参考与自己的亲身实践,只有const char *才能映射为String。

普通的char *需要使用字节数组byte[]来实现,然后调用Native.toString()方法将字节数组转化为String。

clipboard.png

总结

从看官方README,到放弃README看相关博客,到最后学会实现功能并在此总结,前后大概花了三天的时间。

感谢官方的仓库,同时也感谢每一位分享技术的人。

国家职业教育改革实施方案

想到了学校的教育,在这里感慨一下几天前看到的新闻,国务院2月13日发布关于印发国家职业教育改革实施方案的通知。

这么多年了,国家终于发现学校培养的和企业要的不是一回事。

国家鼓励企业参与职业教育,2020年初步建设300个示范性职业教育集团。

过去,是科教兴国。这么多年,这条路是对的,我国也在蓬勃发展,勇夺世界前列。

c++ jna 数据类型_JNA 使用总结相关推荐

  1. c++ jna 数据类型_JNA实战笔记汇总一 简单认识JNA|成功调用JNA

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

  2. java jna 例子_JNA入门实例

    JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程.JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中 ...

  3. jna 构造函数_JNA 相关问题

    JNA 相关问题 结构体对齐问题 要注意调用的c库字段对齐方式的相关设置. #pragma pack (push,1) #pragma pack(pop) jna中提供了4种对齐方式: /** Use ...

  4. java hook jna鼠标_JNA介绍及使用JNA监听鼠标实现

    Java本身是没有提供直接访问系统的API方法,查了下资料,要实现鼠标钩子有3种方法, 1.使用JNI方法,需要自己写C实现,比较复杂. 2.使用swt extension,直接提供了鼠标钩子的实现, ...

  5. Java通过JNA调用so库 Linux环境

    记录一下自己的JNA调研成果,需求是公司同事用C++写了一个红外测温SDK,编译成so文件后提供给客户使用.客户需要一个Linux环境用Java调用so库的一个demo,刚好就我一个懂点Java,所有 ...

  6. JNA实战笔记汇总(二)——JNA和C / C ++的数据类型映射(dll函数回调、结构体、指针)

    目录 JNA技术难点 1.函数回调 2.结构体 3.指针 JNA技术难点 有过跨平台.跨语言开发的程序员都知道,跨平台.预研调用的难点,就是不同语言之间数据类型不一致造成的问题.绝大部分跨平台调用的失 ...

  7. java对jna的配置选项_JNA编程之一:入门 | 学步园

    好了,一堆废话后还是要进入主题,所谓JNA就是"Java Native Access"的缩写.说白了就是Java直接访问/调用本地动态库.最好的入门方法就是从JNA的官网开始. 0 ...

  8. java jna修改系统时间_JNA回调函数使用以及持续回调问题

    本案例为使用JNA,对接顶尖ACLAS电子秤.配置回调函数后,电子秤称重发生变化,自动回调称重数据. 1.JNA调用DLL方法声明 1.只用指明dll文件所在的文件路径+文件名称,不用带后缀. 2.根 ...

  9. java jna 回调函数_JNA中级篇 回调函数详解

    JNI 技术是双向的,既可以从Java 代码中调用原生函数,也可以从原生函数中直接创建 Java 虚拟机,并调用Java 代码.但是在原生函数中调用java代码要写大量C代码,这对大多数java程序员 ...

最新文章

  1. iOS网络传输Delegate不被触发的本质原因
  2. sublime Text3插入参考文献问题
  3. Effective Java~46. 优先选择Stream 中无副作用的函数
  4. Vue数据更新数据不渲染问题 - 资源篇
  5. java 代码块的意义_Java基础(9) - 静态、代码块
  6. 未来会有特供iPhone 来针对各国调查法案?
  7. java并发编程基础 --- 4.2 线程的优先级
  8. js的基本类型有哪些?引用类型有哪些?(二)------null和undefined的区别
  9. 可能确实存在脂肪味觉(隐式味觉)
  10. 你真的需要那么多报表么?| 专栏
  11. 燕山大学计算机二级加综测吗,燕山大学大学生创业协会2018至2019季学期综合测评证明(图)...
  12. 华为签约计算机大学,2020年,华为签约学生多的16所大学,你知道几个?
  13. java和python哪个好?学java和学python哪个更有前途?
  14. ElastSearch整合SpringBoot模仿京东商城实现关键字高亮显示
  15. matplotlib图表多曲线多纵轴绘制工具方法
  16. 2021年山东省青少年人工智能培训
  17. 云计算 : 公有云、私有云、混合云到底是个啥玩意?
  18. PP生产计划-Routing工艺路线
  19. BT656/BT601/BT1120协议以及DM365/DM355/DM6467上使用的YUV颜色空间说明
  20. linux 分区id,分区ID对照表和diskpart更改分区ID的方法

热门文章

  1. 【求助】SpringMVC发生500错误
  2. DAC双通道输出电压实验
  3. java实现抛物线轨迹计算_抛物线、导弹线轨迹计算
  4. 用APPinventor制作一个密码生成器
  5. 工作VS生活:要融合,不要平衡
  6. 探寻后厂村网红联想来酷无人店背后的技术
  7. 从腾讯音乐赴美上市,看中国音乐平台如何拿起接力赛的第一棒
  8. java 实现输出: (a) 输出把错别字替换为正确用字的字符串。 (b) 将“桂工同学”替换为自己的姓名。
  9. 学生专用计算机总共有多少键,学生计算器的每一个键的意思是什么?
  10. Js之鼠标事件-鼠标事件