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

时间:2012-05-17 15:11:35

标签: java callback java-native-interface

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

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

目前我有这样的事情:

  1. 注册回调的Java方法(此回调在Java中注册)并调用C ++“native”方法,该方法将在第三方lib中注册回调(这是通过C ++完成的);
  2. 另一个名为“fireMyEvent”的Java方法,由我的第三方的lib回调(来自C ++)调用。
  3. 这里的问题是当我的第三方的lib回调被触发时,我无法访问JNIEnv,也无法访问作业。

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

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

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

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

    我希望我已经明白我的问题,如果我的研究不足以在这个论坛中找到已有的答案,我道歉:(。

    非常感谢和问候。

    修改: 缓存“ jobject ”似乎不起作用,因为我最终有一个“访问冲突”执行“ CallVoidMethod ”方法。

1 个答案:

答案 0 :(得分:0)

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

请参阅"Local and global references" in this JNI reference