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
访问非静态方法
相关文章:
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 如何通过命名空间调用非静态方法
- 如何在没有实例的情况下获取非静态方法的类型?
- 调用从模板派生的类的静态方法,而不指定模板
- 如何在 c++ 中异步调用静态方法?
- C++ 将静态方法转换为简单方法
- 从另一个标头中的标头调用静态方法
- C++中静态方法的局部变量范围
- 仅在少数方法(静态或共享库)中解析的外部符号
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 当只有静态方法受到影响时,如何解决C++中的链接器错误?
- 静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 从部分专用模板方法调用模板非静态方法
- 如何使用 c++ 在 cocos2dx 中定义非静态方法
- 使用 CMake 的静态方法链接错误
- 在子类上调用模板化静态方法时获取类的类型名
- 仅具有公共静态方法的帮助程序类
- 调用没有主体的未实现静态方法