JNA 使用总结

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

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

引言

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

系统中使用了 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 使用总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

Programming Collective Intelligence

Programming Collective Intelligence

Toby Segaran / O'Reilly Media / 2007-8-26 / USD 39.99

Want to tap the power behind search rankings, product recommendations, social bookmarking, and online matchmaking? This fascinating book demonstrates how you can build Web 2.0 applications to mine the......一起来看看 《Programming Collective Intelligence》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

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

HEX HSV 互换工具