私は新しい仕事を始めました。ここでは、JNI(C++/Javaのブリッジ用)を使用することに新しいことがあります。私はJNIを初めて利用していますので、私のnoobnessを許してください:)JNIとC++のオブジェクトインスタンス
私たちの(win32)Javaアプリケーションでは、C++ DLLをロードしています。 Java側では、「SomeJClass」のいくつかのインスタンスがあります。これらの各インスタンスは、DLL側の「SomeCClass」の対応するインスタンスにアクセスする必要があります。 DLLは、GlobalDoSomethingInC()などのエントリポイントを公開します。ここでは、Doer :: DoSomethingInC()のインスタンスメソッドを呼び出す必要があります。だから私は、それぞれのthis-pointerをマップするためのスムーズな方法が必要です。 また、DLLスレッドが対応するJavaインスタンスに通知する必要がある興味深いものを発見した場合、同じマッピングを行う必要があります。
私はいくつかの解決策を考えることができますが、私はあまり好きではありません。私の質問は、これより良い方法はありますか?
1 JavaはC:GetNewInstance()を呼び出します。これは、実際には新しいCインスタンスへのポインタであるintを返します。 Javaはm_myCInstanceにそれを格納します。その後、JavaはGlobalDoSomethingInC()を呼び出し、 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のか:CからJavaへの呼び出しについて
// 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、物事があまりにも
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);
ない方が良い、多分、見て悪いと思います。しかし、jobject参照を格納するのは本当に安全です。 つまり、GCがオブジェクトを動かすとどうなりますか?
3私たちの現在の解決策は "仕事"です。しかし、それはhttp://www.codinghorror.com/blog/にかなりの属する:)
ありがとう