JNI を利用するテキスト/VoIP プログラムの C++/ネイティブ側を作成しています。現在、C++ 側には、Java コードによって定期的に呼び出される可能性のある関数が 3 つあります。関数が呼び出される頻度は、ユーザーがテキスト メッセージを送受信する頻度と、友人がプレゼンス/ステータスを変更する際にどれだけアクティブであるかによって異なります。3 つの関数はそれぞれ以下の疑似コードに従いますが、関数内の何かを「グローバル化」することが賢明かどうか (または可能かどうかさえ) わかりません。
JNIEnv *env;
if (jvm_->GetEnv((void**) &env, JNI_VERSION_1_6) < 0)
{
[print error and return]
}
jclass stringclass = env->FindClass("java/lang/String"); // Same for all 3
jstring passinfo = env->NewStringUTF([str-info-to-pass]); // Different for all 3
jclass cls = env->FindClass([directory to calling Java function class]); // Same for all 3
[check if cls found, print error if not found and return]
jmethodID methID = env->GetStatisMethodID([arguments for the function]); // Different for all 3
[check if methID found, print error if not found and return]
jobjectArray args = env->NewObjectArray([arguments to build argument structure being passed to function]);
[call Java function, passing right arguments]
私は、jclass stringclass、jclass cls、および JNIEnv *env を関数から移動し、JNI_OnLoad 関数呼び出し中に設定されたグローバルにする必要がある/できると考えていました。これは可能/推奨ですか?これらの値は、OnLoad 関数とこれらの関数で何らかの違いがありますか? それらをグローバルとしてインスタンス化し、関数呼び出しで毎回設定する必要がありますか? そして、これらのいずれかを実行すると、パフォーマンスが大幅に向上しますか?