我已经做了一些研究,包括在 StackOverflow 中,但我仍然有一些问题需要处理,我有点需要你的帮助。
所以,我有一个 Java 库,它被用作第 3 方 C++ 库的包装器。这个 C++ 库是所有逻辑所在。因此,它具有异步行为,并且需要注册回调以获取其事件的通知。我希望能够从 Java 注册回调,并能够在 Java 中获得它们各自事件的通知。
目前我有这样的事情:
- 用于注册回调的 Java 方法(此回调在 Java 中注册)并调用将在 3rd 方库中注册回调的 C++“本机”方法(这是通过 C++ 完成的);
- 另一个 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 ”方法的“访问冲突”。