从Java到第三方C++库的JNI回调系统



我已经做了一些研究,包括在StackOverflow中,但我仍然有一些问题需要处理,我需要你的帮助。

所以,我有一个Java库,用作第三方C++库的包装器。这个C++库是所有逻辑所在的地方。因此,它具有异步行为,并且需要注册回调才能获得其事件的通知。我希望能够注册来自 Java 的回调,并能够在 Java 中收到它们各自事件的通知。

目前我有这样的东西:

  1. 一个Java方法,用于注册回调(此回调在Java中注册(并调用C++"本机"方法,该方法将在第三方库中注册回调(这是通过C++完成的(;
  2. 另一个Java方法,命名为"fireMyEvent",由我的第三方的lib回调(来自C++(调用。

这里的问题是,当我的第三方的 lib 回调被触发时,我无法访问 JNIEnv 或 jobject。

我在 StackOverflow 上看到了如何通过缓存 JavaVM 指针来访问 JNIEnv 指针。尽管如此,我不确定如何访问jobject实例,以便能够调用我的CallVoidMethod:

env->CallVoidMethod(theJObjectThatIWant, methodId, ...)

我虽然在调用在我的第 3 方库中注册回调的 C++ 方法期间缓存 jobject,但我不确定这在应用程序中有多个"Java 包装器对象"(我指的是通过 JNI 包装C++功能的对象(的情况下是否可以接受。

你有什么建议来克服这种情况?

我希望我已经把我的问题说清楚了,如果我的研究不够好,无法在这个论坛:(中找到已经存在的答案,我深表歉意。

非常感谢和问候。

编辑:缓存">jobject"似乎不起作用,因为我最终在执行">CallVoidMethod"方法时遇到了"访问冲突"。

要在本机调用结束之后缓存 Java 引用,需要全局引用。

请参阅此 JNI 参考中的"本地和全局引用"。

最新更新