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

在最近的项目中又遇到了一个个人感觉有点摸不着头脑的事情(也许是因为个人原因懈怠了。。。。。。)。最“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浏览器中,某些原因前端展示只能用谷歌。。那就得注册个控件

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用JNA调用C++的构造函数需要一些额外的步骤。首先,需要在C++中编写一个导出构造函数的动态。然后,在Java使用JNA加载该动态调用该构造函数。下面是一个简单的示例: 首先,创建一个C++的动态,例如libexample.so。在该中,定义一个类Example,如下所示: ```cpp class Example { public: Example(int a, int b); int add(); private: int m_a; int m_b; }; Example::Example(int a, int b) : m_a(a), m_b(b) {} int Example::add() { return m_a + m_b; } ``` 然后,为该类定义一个构造函数的导出函数,如下所示: ```cpp extern "C" { Example* Example_new(int a, int b) { return new Example(a, b); } } ``` 编译并生成动态,例如libexample.so。 接下来,在Java使用JNA加载该动态调用该构造函数,如下所示: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.PointerByReference; public class ExampleJNA { public interface ExampleLibrary extends Library { ExampleLibrary INSTANCE = (ExampleLibrary) Native.loadLibrary("example", ExampleLibrary.class); Pointer Example_new(int a, int b); } public static void main(String[] args) { Pointer examplePtr = ExampleLibrary.INSTANCE.Example_new(1, 2); Example example = new Example(examplePtr); System.out.println(example.add()); // 输出 3 } public static class Example { private Pointer examplePtr; public Example(Pointer examplePtr) { this.examplePtr = examplePtr; } public int add() { return examplePtr.getInt(0) + examplePtr.getInt(4); } } } ``` 在Java中,使用JNA的Pointer类来表示C++对象的指针。在Java中创建Example对象,需要将C++对象的指针传递给Example类的构造函数。在Example类中,使用Pointer类来访问C++对象的成员变量和成员函数。 注意:为了使用JNA调用C++的构造函数,需要使用extern "C"来告诉编译器该函数的名称应该是C链接方式的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值