看完此篇文章,Java调用C/C++不再是件麻烦事^_^

如需转载请说明出自本篇博客!

最近因为项目需要,研究了一段时间跨语言互调的知识,然后成功的解决难题,因此整理分享。

关于JNA的使用例子可以参考我之前的博客文章。
本章对于JNA推荐一个神器!!!
熟悉JNA使用流程的小伙伴们都知道,你需要去将对应的C/C++的头文件中的函数,转换成Java中的方法,而遇到复杂类型的时候比如结构体,函数指针这些时最为头疼。不光要对照类型转换表,而且要继承对应的JNA中的类型的类。比如 Java中要模拟一个结构体,需要创建一个类继承于Structure。
在这次的项目中,因为转换C++的方法为Java的方法特别多,写得快要吐了,在写完之后,偶然间的功夫,在github上发现了一款神器! 我屮艸芔茻,我擦! 自动将C、C++头文件生成java方法。。此时我心里一万头草泥马奔过啊。。。
以下是下载链接。。。强行收点小积分_
JNA工具
具体使用方法就是将头文件拷贝至左侧,然后点击generate,右侧就自动生成了java的方法。

在使用JNA方式完成了项目之后,发现性能上并不是很理想,查了一些资料,并且自己动手写了测试代码验证了JNA性能要比JNI差很多。因此转向JNI重新开发。

但是麻烦的事情就出现了。

问题在于:JNI的开发流程是 先通过java文件生成JNI的头文件,然后使用这个JNI的头文件去实现C/C+的方法。 而现在项目中是提供了已经实现好的库文件,因此常规的使用JNI的方法行不通。

这时可以使用swig。 swig是一个能够自动生成链接代码的工具。熟悉JNI的小伙伴们知道,拿着JNI的头文件去实现C++的代码真的是麻烦得要死。但是现在有了swig,这部分代码就不用自己去写。swig可以根据C/C++的头文件自动生成JNI所需要的代码,只后直接拿着生成的代码和C的源代码一起编译成库文件就可以给java调用了。

当时刚查看这个工具的时候,感觉是方便,但是我已经有了库文件并没有代码源文件该怎么办呢? 这时候可以使用g++的链接,将生成好的swig文件和已经有的库文件通过g++指令链接成一个新的库文件,此时拿着这个库文件就可以让Java去随意的调用C/C++函数了。

看到这里,我这篇文章所想说的东西就完毕了。接下来附上一步步的操作过程。

  1. 首先是编写swig的i文件。
    文件内容如下
%module CircleDemo
%{  
#include "Circle.h"
%}
%include "Circle.h"

这里的module名称就是最后生成的JNI文件中需要调用的库函数的名称。

紧接着使用如下命令执行swig

swig -c++ -java -package com..demo -outdir ./ -I../include qnlg.i

这里参数就是前四个是固定的,第五个是自定义的包名,第六七位是指定输出目录,这里./是指当前目录。后边是指向.i文件。运行该命令之后将生成多个java文件以及一个cxx结尾的文件。
如果此时你有C/C++的源代码,那就使用这个cxx的文件和源代码一起build出一个库文件dll/so.
如果没有源代码,那就使用这个cxx文件和已经有的库文件链接生成新的库文件。链接的指令如下:

g++ -fpic -shared -o apidhybird.dll demo_wrap.cxx -I"C:\SoftWares\jdk\include" -I"C:\SoftWares\jdk\include\win32" c_apid.dll -L.

这里的参数解释如下:

-o apidhybird.dll 是指输出的库名称
demo_wrap.cxx 是指的swig生成的文件
-I"C:\SoftWares\jdk\include" -I"C:\SoftWares\jdk\include\win32" 是指g++编译需要的动态库
c_apid.dll 是指已经存在的动态库
-L. 这个是指链接
到此为止就可以产生一个新的库文件。

注意!swig生成的很多java文件,你需要编译成class,然后打成jar包。

新建一个工程,加载库函数,然后倒入jar包,然后就可以调用jar包中的本地方法了。这些本地方法,swig的cxx文件已经在库文件中自动帮你转接调用了。

可能说的有些生涩,但是你动手尝试了之后就会恍然大悟。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_Boss_Hao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值