细数Java使用JNA或者JNative在调用C++函数的过程中所遇到的坑以及个人解决办法

本文介绍了在Java项目中使用JNA和JNative调用C++ SDK时遇到的问题及解决方案。首先,文章解释了JNA的基本原理和用途,然后详细描述了在加载本地库、函数名匹配和处理C++编译后的函数名问题上遇到的挑战。在解决函数名改变的问题时,推荐了Dependency Walker工具。最后,由于JNA在处理特定C++特性时的限制,作者转向了JNative,并简述了它的使用方法和注意事项。

在最近的项目中又遇到了一个个人感觉有点摸不着头脑的事情(也许是因为个人原因懈怠了。。。。。。)。最“eggache”的一件事情就是又双叒叕遇到了前端页面视频对接的坑(本猿着实没了解过啊T-T)。

本着求教的一脸呆萌像从我师傅那里了解到了“JNA”。。(框架?类库?一头雾水ING)是基于JNI,能够让JAVA程序员写更少的代码去调用系统本地库。这我就很喜欢了:)(write less do more~~~haha)

话不多说,

先介绍一下JNI是什么鬼:JNI_百度百科

再介绍一下JNA是什么鬼:JNA(其他)_百度百科

简单说明一下,在本人的项目中,原先设计是需要使用java去调用供应商  “‘西边’‘伟力’”  提供的sdk(只有C++一个版本的sdk、只有C++一个版本的demo。。为何这么cuo)中的函数,获取视频流对象,封装成服务,供前端使用。但是鉴于某些原因,此设计被废弃了。。(美其名曰“节约成本”)。最后根据一位前辈给出的一个建议,并结合实际业务需求,就设计出了一个很奇葩的东西。。。可以脑补一下“写了个ocx插件集成到ie浏览器中,某些原因前端展示只能用谷歌。。那就得注册个控件,让谷歌浏览器能打开IE浏览器,其他展示在谷歌浏览器中操作,看视频单独拉个IE浏览器播放”,额,意不意外?神不神奇?

话不多说回归正题:

首先得承认“JNA”是个很好用的类库,会让我感到神奇,能在java中去操作指针(是本人才疏学浅,各位大佬轻喷)。。。使用的大致流程网上的技术贴都有,我就不赘述,挑选了一个我觉得不错的贴。

Java通过JNA方式调用DLL_luffy5459的博客-CSDN博客_jna 调用dll(感谢这位前辈的分享)

总结大致调用流程就是

1、写个“本地系统类库”,例如“dll(动态链接库)”之类的东西。在本人项目中是由供应商提供的dll

2、晓得本地类库中的方法

3、在java接口中申明与步骤2得到的函数名一样的方法

好,接下来就要讲讲我遇到的坑了。。。

1、首先第一个,很多人都会遇到的坑,就是加载“本地类库”

本人在网上找过挺多的帖子。。说来说去你复制我我粘贴你的那种,但是还是能够解决Native类库加载的问题的。

2、再一个就是。。。类库中方法名的问题

根据供应商的陈述,他们提供的sdk中的函数名就是实际开发中的函数名,但是我这儿死活调用不到哇T-T,实力坑“我”啊

好吧,调用不到函数,那只有几种原因,一个是函数名真的不对,一个是类库加载不对等等。。。

我就巧了,正好是第一个,为啥呢?因为这*(和谐)类库是***(和谐)C++编译器编译出来的鬼东西。。函数名在编译的时候被改变了。。WTF?别问我为啥知道的,因为我拿到的是debug版本的sdk,成功反编译出来的!haha~~顺便安利一款工具,此工具能够查看dll中的函数名:Dependency Walker (depends.exe) Home Page

3、还有一个就是。。。(大坑,深坑,巨坑)

C++编译过后的函数名是类似:“_xxx@0”这样的,

但是JAVA中能这么命名方法名嘛?!!!

得第三个问题就直接限制了JNA的路不通啊不通啊。。

写到这儿是不是就可以顺利引出“JNative”(一个连作者自己几年前就不维护的开源项目)了?

haha~百度百科没有对JNative项目的介绍

JNative : Java to native interface download | SourceForge.net这个应该是JNative的“官网”,从这儿下载。

调用方法与JNA类似,但其“数据类型”有所差异,都是先加载类库,然后balabala。。。

唯一的好处是啥,不用申明与函数名相同的方法名,因为函数名是在申明具体对象的时候作为构造函数中的第一个String类型的参数去使用的。所以这样我们就能继续调用本地类库咯。。。就是回调、操作指针比较坑爹,以及手动分配内存一定要记得释放就是在invoke()之后,如果使用了内存,就需要调用dispose()方法。

就写这么多吧,继续扣代码了,还希望各位大佬批评指正~

此致  敬礼

      Demons丶丶

      2019-05-13

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值