JNA 使用总结

栏目: C++ · 发布时间: 5年前

内容简介:新系统起步,带领两个可爱的小组员李宜衡、潘佳琦一起学习、讨论、编码。系统中使用了之前对这项技术也只是听说过,也没用到过。

引言

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

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

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

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

JNA 使用总结

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

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

JNA

C++

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

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

JNA 使用总结

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

JNA 使用总结

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

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

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

JNA

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

JNA 使用总结

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<String> getFieldOrder() {
        return Arrays.asList("name", "context");
    }
}

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

1.为什么属性是 public 的?

这个也没找到原因,最开始使用 privategetset 去映射时,一直报错,具体记不清了,应该是类似字段找不到的错误。应该是 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

JNA 使用总结

总结

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

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

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

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

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

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

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

科学,需要发展,但推动经济发展的,却是工程。

一直以来,我始终坚信:既然存在于这世界,那每个人都是完美的,每个人都是平等的,只是教育资源短缺,所以非要拿分数来分个三六九等。

来了河北工业大学,和衡水的学生比一比,我上的简直不叫高中。他们在晨读,我们还未起;他们在学习,我们在过周末。

也羡慕过考上复旦的同学,看看人家的努力,一切都是公平的。为了弥补之前的遗憾,我一直努力着~

加油!别放弃往昔的梦想,努努力,你我都可以!

JNA 使用总结


以上所述就是小编给大家介绍的《JNA 使用总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

决战618:探秘京东技术取胜之道

决战618:探秘京东技术取胜之道

京东集团618作战指挥中心 / 电子工业出版社 / 2017-11 / 99

《决战618:探秘京东技术取胜之道》以京东技术团队备战618为主线,集合京东数百位技术专家,对京东所有和618相关的关键技术系统进行了一次全面的梳理和总结,是京东技术体系的智慧结晶。 《决战618:探秘京东技术取胜之道》从前端的网站、移动入口到后端的结算、履约、物流、供应链等体系,系统展示了京东最新的技术成就。同时,也涵盖了京东正在充分运用大数据、人工智能等先进技术对所有技术体系架构进行整体......一起来看看 《决战618:探秘京东技术取胜之道》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具