博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ jna 数据类型_JNA 使用总结
阅读量:1533 次
发布时间:2019-04-21

本文共 2193 字,大约阅读时间需要 7 分钟。

引言

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

系统中使用了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个示范性职业教育集团。

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

转载地址:http://gxydy.baihongyu.com/

你可能感兴趣的文章
SAP MM移动平均价和标准价逻辑
查看>>
SAP MM模块相关透明表收集
查看>>
王峰记忆法 解密王峰记忆法之迷
查看>>
传统BI为什么注定会失败?
查看>>
ETL工具大全,你了解多少
查看>>
TRFC/QRFC
查看>>
18、Power Query-SQL筛选
查看>>
46、Power Query-Table.FillDown函数简介
查看>>
CDS – One Concept, Two Flavors
查看>>
SAP Development Tools
查看>>
ABAP算术运算函数
查看>>
用新语法写更简洁的ABAP代码
查看>>
ABAP类的方法
查看>>
SAP用户增强总结-采购订单建立增加客户数据增强示例
查看>>
物料帐结算,库存差异为何在下月初冲回
查看>>
SAP中创建分部机构凭证号码并且按年度编号
查看>>
BUUCTF [极客大挑战 2019] BuyFlag
查看>>
BUUCTF [极客大挑战 2019] Secret File
查看>>
个人博客项目之editormd实现写文章功能
查看>>
设计模式之组合模式(结构型)
查看>>