天天看点

java 调用c++类库_java调用c++库的项目实例

java调用c++库的项目实例

通常java调用c++的库文件使用java的jni技术,但是由于sdk需要调用的功能点比较多,jni的技术步骤繁多,工作量比较大,通过网上收集的资料有更好的方式来完成,即jna技术。

JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。

JNA类库使用一个很小的本地类库动态的调用本地代码。只需要使用一个特定的java接口描述一下将要调用的本地代码的方法的结构和一些基本属性。这样就省了为了适配多个平台而大量的配置和编译代码。因为调用的都是JNA提供的公用jar包中的接口。

具体过程为,jna官网下载 https://jna.java.net/ 下载jar包,最新版本为4.1.9,见下图

(所有图片见附件)

将这两个jar包加入工程中。

可以下载一个工具,它可以根据c头文件生成可以直接java调用的类,改工具名称为JNAerator-master,下载源码编译后可得到一个图形化的页面,打开该工具的方式为:

打开后的界面如下:

界面左边为h头文件,右边为c语言结构体生成的对应的java类,也可以将c语言方法对应的生成java语言的接口。将生产的java源代码放入到工程中就可以先用的调用c语言提供的功能了。在本项目中

HCNetSDK.sh为头文件生成的结构体对应的java及各个c函数在HCNetSDKLibrary.java里面。比如头文件里面的函数

对应生成java里面的方法:

相应的结构体也生成了java的类

到此为止c++的调用,就完全转换成java的调用了,很简单吧。

另外在传递参数的时候,java于c对应的基本类型有对应关系,相应的参数需要对应下:

特别是c里面无符号整数,在java里面是没有相应的的对应的,要么java语言做下转换,要么在定义c++接口的时候尽量使用long long型参数。

下面将无符号整数转换的函数列出:

其他主要注意的事项是,如果java为32位的版本,相应的c库文件也要32位的,64位的java对应c库64位的。在指定库文件位置时,可以设定java系统参数,解决找不到库文件的异常: