Je viens de commencer un nouveau travail. Ici, nous sommes nouveaux à l'aide de JNI (pour le pontage C++/Java). Je suis nouveau à JNI alors s'il vous plaît pardonnez mon noobness :)Instances d'objets JNI et C++
Dans notre application (win32) Java, nous sommes en train de charger une DLL C++. Du côté Java nous avons plusieurs instances de "SomeJClass" chacune de ces instances a besoin d'accéder à l'instance correspondante de "SomeCClass" du côté DLL. La DLL expose des points d'entrée tels que GlobalDoSomethingInC(). Ici, je dois appeler la méthode d'instance de Doer :: DoSomethingInC(). J'ai donc besoin d'un moyen facile de mapper les pointeurs respectifs. J'ai aussi besoin de faire le même mapping lorsqu'un thread DLL découvre quelque chose d'intéressant dont il a besoin pour notifier l'instance Java correspondante de.
Je peux penser à plusieurs solutions, mais je ne les aime pas trop. Ma question est la suivante: y a-t-il un meilleur moyen que celui-ci?
1 Java appelle C: GetNewInstance(). Cela retourne un int qui est en fait un pointeur sur la nouvelle instance C. Java le stocke dans m_myCInstance. Ensuite, appelle Java GlobalDoSomethingInC() et 1a
// DLL global
void GlobalDoSomethingInC()
{
// retrive this pointer
//calling back to Java:
jobj tmpJ = NewGlobalRef(env, obj);
Doer* myDoer = <reinterpret_cast>(Doer)tmpJ->GetMyCInstance();
myDoer->DoSomething();
DeleteGlobalRef(env, tmpJ);
// Arrrrgh
}
1b ou:
// for **every call** that Java adds a parameter,
//which is the stored int:m_myCInstance, and
Doer* myDoer = <reinterpret_cast>(Doer)instanceParam->DoSomethingInC();
// Can we do better that this?
2 Pour appeler de C à Java, les choses, peut-être, mieux
In the constructor C calls back into Java and stores
the Java instance reference
in a member variable. m_myJInstance.
In all subsequent calls m_myJInstance can be used to call back Java.
In the destructor we need to call DeleteGlobalRef(env, m_myJInstance);
Pas trop mauvais je suppose. Mais il est vraiment sûr de stocker la référence jobject. Je veux dire: Que se passe-t-il lorsque le GC déplace l'objet?
3 Notre solution actuelle "fonctionne". Mais il appartient plutôt sur le http://www.codinghorror.com/blog/ :)
Thanx