0
我试图重构一些android jni代码。它最初设置为在JNI中使用静态变量,在Android端使用静态调用。我想改变这一点,以提高与其他代码的兼容性。android jni从静态方法到非静态方法
电流的方法签名
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);
}
由于此项目目前设置为存储主要活动和功能地址sses作为一个静态参考,只需拨打get_android_jni_env();
即可访问获取当前的android jni环境。
如何重构此代码,以便能够获取实例而不是保持静态引用?
即使您将MainActivity类中的这些方法设置为非静态,您仍然需要保留对MainActivity实例的全局引用。更糟糕的是,今天你可以在Java中保留这个引用,但是现在你也需要在你的本地代码中知道它。 –