将Java类实例绑定到C ++类实例

时间:2012-08-09 03:46:22

标签: java c++ java-native-interface

我正在尝试为动态库编写一个包装器,我没有所有的源代码,正如大多数使用JNI的人似乎都在尝试这样做。

我需要做的是使用Java包装类调用C ++类的构造函数,然后通过Java类的实例将该C ++类实例用于所有其他本机方法。只要Java类只有一个实例,只要新实例生成旧的C ++实例就会被新的实例覆盖,这样就可以正常工作。我必须能够创建多个实例,因为每个实例都处理一个传感器。

有没有办法优雅地将Java类实例绑定到C ++类实例?

免责声明:我不是C ++程序员,只不过猴子是人类。即使是C ++末端最简单的答案也可能有所帮助。

3 个答案:

答案 0 :(得分:3)

你应该熟悉同伴类的概念。

在Sun的这本在线书中(或Oracle挑剔)对此进行了详细描述:Peer Classes

答案 1 :(得分:0)

您可以使java类成为Singleton,并确保没有创建其他java类实例。 我想这是你可以为此做的解决方案

答案 2 :(得分:0)

完全不知道对等类,我会执行以下操作:在Java类中有一个native void register()(或类似),您想要配对。在C JNI部分中,将调用GlobalRef的{​​{1}}存储为jobject中的密钥。您可以通过构造函数将std::map<jobject,NativeImplementationObject>键设置为C ++对象,以简化对JVM的回调。在从JVM到任何与传感器相关的本机方法的任何后续调用中,通过与当前调用的jobject进行GlobalRef比较来查找右NativeImplementationObject。然后简单地“转发”对该对象的调用。 JNI存根实现将只是一个持有地图的瘦调度程序。当然,在适当的时候删除所有对象和全局引用都是非常重要的部分(没有自动化JVM),但这超出了这里可以解释的范围。

再想一想,你可能不需要地图,除非传感器的数量适中(至少数十个数量级),或者你愿意通过使用上面提到的比较谓词函数来学习一些人类技能IsSameObject。一个简单的结构列表也可以(对猴子和人类都一样)。