android jni 从静态方法到非静态方法
android jni from static to non static methods
我正在尝试重构一些 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);
}
由于此项目当前设置为将主要 activity 和函数地址存储为静态引用,仅调用 get_android_jni_env();
允许我访问当前 android jni环境。
如何重组此代码以获取实例而不是保留静态引用?
只需添加一个静态方法作为"getInstance()"来获取classmain_activity的对象,然后就可以使用该对象调用非静态方法
jmethodID midGetInstance = (*env)->GetStaticMethodID(env, main_activity_class, "getInstance", "()Lcom/package/yourapp/MainActivity;");
jobject main_activity_obj = (*env)->CallStaticObjectMethod(env, main_activity_class, midGetInstance);
...NewGlobalRef(main_activity_obj);
其中 main_activity_class
与您原来的 jclass main_activity.
相同
在Java这边,你需要
onCreate(...) {mInstance = this;...}
public static MainActivity getInstance() {return mInstance;}
然后您可以使用main_acitivty_obj
访问非静态方法。
我正在尝试重构一些 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);
}
由于此项目当前设置为将主要 activity 和函数地址存储为静态引用,仅调用 get_android_jni_env();
允许我访问当前 android jni环境。
如何重组此代码以获取实例而不是保留静态引用?
只需添加一个静态方法作为"getInstance()"来获取classmain_activity的对象,然后就可以使用该对象调用非静态方法
jmethodID midGetInstance = (*env)->GetStaticMethodID(env, main_activity_class, "getInstance", "()Lcom/package/yourapp/MainActivity;");
jobject main_activity_obj = (*env)->CallStaticObjectMethod(env, main_activity_class, midGetInstance);
...NewGlobalRef(main_activity_obj);
其中 main_activity_class
与您原来的 jclass main_activity.
在Java这边,你需要
onCreate(...) {mInstance = this;...}
public static MainActivity getInstance() {return mInstance;}
然后您可以使用main_acitivty_obj
访问非静态方法。