我在全局中存儲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;
}
編輯
我兵在這裏有點啞,都將使用globalEnvPointer
的方法,是我的init中調用,因爲我init
實際上是我c
程序main
方法,從而贏得了」直到程序結束。我也沒有在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