我正在编写一个使用 JNI 的文本/VoIP 程序的 C++/Native 端。目前,Java 代码可能会定期调用 C++ 端的三个函数。调用函数的频率将取决于用户发送/接收文本消息的频率以及他们的朋友在改变他们的存在/状态方面的活跃程度。这三个函数中的每一个都遵循下面的伪代码,我不确定在函数中“全球化”任何东西是否明智(甚至可能)。
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 函数与这些函数有所不同?我是否应该将它们实例化为全局变量并在函数调用中每次都设置它们?而且,做这些真的会显着提高性能吗?