1

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

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

目前我有这样的事情:

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

这里的问题是,当我的第 3 方的 lib 回调被触发时,我无法访问 JNIEnv,也无法访问作业对象。

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

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

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

您对克服这种情况有何建议?

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

非常感谢和问候。

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

4

1 回答 1

0

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

请参阅此 JNI 参考中的“本地和全局参考”

于 2012-05-17T16:14:52.547 回答