gpt4 book ai didi

java - 从 Java 到第 3 方 C++ 库的 JNI 回调系统

转载 作者:行者123 更新时间:2023-12-01 05:19:32 24 4
gpt4 key购买 nike

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

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

目前我有这样的东西:

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

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

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

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

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

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

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

非常感谢和问候。

编辑:缓存“jobject”似乎不起作用,因为我最终在执行“CallVoidMethod”方法时出现“访问冲突”。

最佳答案

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

参见"Local and global references" in this JNI reference .

关于java - 从 Java 到第 3 方 C++ 库的 JNI 回调系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10638432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com