【发布时间】:2015-09-18 04:49:03
【问题描述】:
我正在尝试重构一些 android jni 代码。它最初设置为在 JNI 中使用静态变量和在 android 端使用静态调用。我想更改它以提高与其他代码的兼容性。
当前方法签名
static jclass main_activity;
static jmethodID on_init;
static jmethodID on_update;
static jmethodID on_render;
static jmethodID on_exit;
static jmethodID on_get_input;
这些绑定是在代码开头设置的,如下所示:
main_activity = (jclass)((*mEnv)->NewGlobalRef(mEnv, cls));
on_init = (*mEnv)->GetStaticMethodID(mEnv, main_activity,
"on_native_init","()V");
on_update = (*mEnv)->GetStaticMethodID(mEnv, main_activity,
"on_native_update","()V");
on_render = (*mEnv)->GetStaticMethodID(mEnv, main_activity,
"on_native_render","()V");
on_exit = (*mEnv)->GetStaticMethodID(mEnv, main_activity,
"on_native_exit", "()V");
然后在后面的代码中它们将像这样使用:
void Android_JNI_SwapEGLwindow(void)
{
JNIEnv *a_env = get_android_jni_env();
(*mEnv)->CallStaticVoidMethod(a_env, main_activity, on_update);
}
由于该项目当前设置为将主要活动和函数地址存储为静态引用,只有对 get_android_jni_env(); 的调用允许我访问以获取当前的 android jni 环境。
我怎样才能重新构建这段代码以获取实例而不是保持静态引用?
【问题讨论】:
-
即使您在 MainActivity 类中使这些方法成为非静态方法,您仍然需要保持对 MainActivity 实例的全局引用。更糟糕的是,今天您可以在 Java 中保留此引用,但现在您也需要在本机代码中了解它。
标签: java android c++ c java-native-interface