【问题标题】:android jni from static to non static methodsandroid jni 从静态到非静态方法
【发布时间】: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


【解决方案1】:

只需添加一个静态方法“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 来访问非静态方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多