I’ve done some research, including here in StackOverflow, but I still have some issues to deal and I kind of need your help.
So, I have a Java lib that’s used as wrapper to a 3rd party C++ lib. This C++ lib is where all the logic is. So, it has an asynchronous behaviour and there’s the need to register callbacks to get notified for its events. I want to be able to register callbacks from Java and to be able to get notified of their respective events in Java.
Currently I have something like this:
- A Java method to register a callback (this callback is registered in Java) and to call a C++ “native” method that will register a callback in the 3rd party lib (this is done via C++);
- Another Java method, named something like “fireMyEvent”, to be called by my 3rd party’s lib callback (from C++).
The problem here is that when my 3rd party’s lib callback is fired I don’t have access to the JNIEnv, nor to the jobject.
I’ve seen here at StackOverflow how to access the JNIEnv pointer by caching a JavaVM pointer. Nevertheless, I’m not sure how to access the jobject instance, to be able to call my CallVoidMethod:
env->CallVoidMethod(theJObjectThatIWant, methodId, ...)
I though about caching the jobject during the call to the C++ method that registers the callback in my 3rd party lib, but I’m not sure if this is acceptable in a scenario where there are more than one “Java wrapper objects” (I’m referring to the object that wraps the C++ functionality through JNI) in an application.
What are your suggestions to overcome this situation?
I hope I’ve made made my problem clear and I apologize if my research wasn’t good enough to find an already existing answer in this forum :(.
Many thanks and regards.
Edit:
Caching the “jobject” doesn’t seem to be working, because I end up having an “Access violation” executing the “CallVoidMethod” method.
To cache a Java reference beyond the end of a native call, a global reference is required.
See “Local and global references” in this JNI reference.