gpt4 book ai didi

java - 收到回调后从 JNI 调用 Java 方法

转载 作者:行者123 更新时间:2023-11-29 05:08:18 27 4
gpt4 key购买 nike

我正在构建一个 JNI 应用程序。

我想从我的 JNI 代码中调用更新 UI 的 Java 函数。

基本上,当我收到回调并尝试获取对环境的引用时,我会收到以下类型的错误:致命信号 11 (SIGSEGV) 位于 0x00000000 (code=1),线程 1869 (ALooper)

我读过对 env 的静态引用不好,但我可以对 JavaVM 有静态引用

你能告诉我我做错了什么吗?

非常感谢您的宝贵时间

jclass globalClass = NULL;
static JavaVM* mVm = NULL;

jint JNI_OnLoad(JavaVM* vm, void* reserved) {
mVm = vm;
JNIEnv* env;

if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
__android_log_print(ANDROID_LOG_DEBUG, "nativeTAG", "get env failed");
return -1;
}
return JNI_VERSION_1_6;
}

static void callMyJavaFunction() {
JNIEnv* env;
jclass playerUtils = NULL;
jmethodID updatePlayerStatus = NULL;
jobject myObject = NULL;

if ((*mVm)->GetEnv(mVm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
__android_log_print(ANDROID_LOG_DEBUG, "jajaja", ">>NATIVE jni failed");

/*ERROR A/libc(1853): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 1869 (ALooper)*/
}

playerUtils = (*env)->FindClass(env,
"com/example/customviewcircles/nativeaudio/PlayerUtils");

if (playerUtils != NULL) {
updatePlayerStatus = (*env)->GetMethodID(env, playerUtils,
"updatePlayerStatus", "()V");

if (updatePlayerStatus != NULL) {
myObject = (*env)->NewObject(env, playerUtils, updatePlayerStatus);

(*env)->CallVoidMethod(env, myObject, updatePlayerStatus);
}
}
}

void myCallBackFunction() {
callMyJavaFunction();
}

最佳答案

在一个聪明的伙伴告诉我我得到它的方法之后。

如果有人需要它:

jclass globalClass = NULL;
static JavaVM* mVm = NULL;

jint JNI_OnLoad(JavaVM* vm, void* reserved) {

mVm = vm;

JNIEnv* env;
jclass playerUtils = NULL;

if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
__android_log_print(ANDROID_LOG_DEBUG, "jajaja", ">>NATIVE jni failed");
return -1;
}
playerUtils = (*env)->FindClass(env,
"com/example/customviewcircles/nativeaudio/PlayerUtils");

if (playerUtils != NULL) {

globalClass = (*env)->NewGlobalRef(env, playerUtils);
}
return JNI_VERSION_1_6;
}

void callMyJavaFunction() {

JNIEnv* env;
jmethodID updatePlayerStatus = NULL;
jobject myObject = NULL;

if((*mVm)->AttachCurrentThread(mVm, &env, NULL) == JNI_OK) {
__android_log_print(ANDROID_LOG_DEBUG, "jajaja", ">>NATIVE attached successfully");
}

if (globalClass != NULL) {

__android_log_print(ANDROID_LOG_DEBUG, "jajaja",
">>NATIVE globalclass not null");

updatePlayerStatus = (*env)->GetMethodID(env, globalClass,
"updatePlayerStatus", "()V");

if (updatePlayerStatus != NULL) {

myObject = (*env)->NewObject(env, globalClass, updatePlayerStatus);
}
}
(*mVm)->DetachCurrentThread(mVm);

}

void myCallBackFunction() {
callMyJavaFunction();
}

关于java - 收到回调后从 JNI 调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29649201/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com