2

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

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

有什么方法可以优雅地将 Java 类实例绑定到 C++ 类实例?

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

4

3 回答 3

3

您应该熟悉对等类的概念。

这在 Sun(或 Oracle 挑剔的)的这本在线书籍中有详细描述:Peer Classes

于 2012-08-09T08:07:46.720 回答
0

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

于 2012-08-09T03:55:26.583 回答
0

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

再想一想,您可能不需要地图,除非传感器的数量相当大(至少在几十个数量级),或者您愿意通过使用上述的比较谓词函数来学习一些人类技能IsSameObject。一个简单的结构列表也可以(对于猴子和人类)。

于 2012-08-10T21:37:53.837 回答