JNIEnv
をグローバルに保存しているので、後で静的Javaメソッドを呼び出すことができます。しかし、JNIEnv
へのグローバルポインタを他のJavaオブジェクトと一緒に保存するのは当然でしょうか、それを必要としない特別なケースです。JNIEnv環境へのグローバル参照の維持
JNIEnv* globalEnvPointer;
[JNICALL etc] void init(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
}
編集
私は私のinit
が実際に「勝った私のc
プログラムのmain
方法であるためglobalEnvPointer
を使用するすべてのメソッドは、私のinit内で呼び出され、ここではビットダムビングよプログラムが終了するまで戻りません。私はまた、Cプログラムで他のスレッドを使用していません。私はこれが答えを単純化すると思う。
JNIEnv* globalEnvPointer;
[JNICALL etc] void main(JNIENv* env, [etc])
{
//required?
globalEnvPointer = (JNIENv*) (env*)->GetGlobalRef(env, env);
//or is this OK?
globalEnvPointer = env;
someMethod();
}
void someMethod()
{
//use globalEnvPointer here
}
違いはありますか?つまり、私の 'init'は後で静的javaメソッドを呼び出すのと同じスレッドで呼び出されます。 – weston
C関数で入ってくる 'JNIEnv'ポインタを必ず使用してください。私の最後の例のように。 – maba
'Java_package_Class_method'が' someCallback'と呼ばれている場合は、 'JavaVM'を経由する必要はありません。実際には、これは私がやっていることです。単に 'someCallback'に渡すのではなく、グローバルを使うだけです。 – weston