【问题标题】:JNI callback system from Java to a 3rd party C++ lib从 Java 到第三方 C++ 库的 JNI 回调系统
【发布时间】:2012-05-17 15:11:35
【问题描述】:

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

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

目前我有这样的事情:

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

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

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

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

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

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

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

非常感谢和问候。

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

【问题讨论】:

    标签: java callback java-native-interface


    【解决方案1】:

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

    "Local and global references" in this JNI reference

    【讨论】:

    • 成功了,谢谢! :) 我使用了类似的东西:“g_jObject = env->NewGlobalRef(obj);”其中“obj”是方法的参数。
    • 尽管如此,如果我实例化两个“Java 包装器对象”(使用 JNI 的类的实例),我可以看到在第二个对象中我的“缓存对象”具有第一个对象的值。所以,我还有一半的问题要解决,让缓存的 JNI 变量在“Java 包装器”的实例之间独立。
    • 缓存的对象是否指向两个 Java 包装对象?当您说它们具有相同的值时,您的意思是它们具有与本机指针相同的值吗?
    • 嗨!我在本机构造函数(由 Java Wrapper 的构造函数调用)中设置了 g_jObject 的值。因此,当我调试本机构造函数时,当我创建第二个 Java Wrapper 时,我可以看到我的 g_jObject 具有与在创建第一个 Java Wrapper 实例时设置的相同的十六进制地址。所以,当我在我的第二个 Java Wrapper 实例中设置 g_jObject 的值时,无论我是在第一个 Java Wrapper 实例的范围内,还是在第二个 Java Wrapper 实例的范围内,这都是从现在开始的值。但是,到目前为止,感谢您的关注! :)
    • 你的 g_ 前缀是指全局 C 变量还是全局 JNI 引用?
    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多