Android jni从静态到非静态方法

android jni from static to non static methods

本文关键字:静态方法 静态 jni Android      更新时间:2023-10-16

我正在尝试重构一些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环境。

我如何重组这段代码,以便能够获得一个实例,而不是坚持一个静态引用?

只需添加一个静态方法作为"getInstance()"来检索main_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访问非静态方法