簡體   English   中英

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);
}

由於當前已將該項目設置為將主要活動和函數地址存儲為靜態引用,而僅調用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來訪問非靜態方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM