[英]Call Java method from JNI after callback is received
我正在构建一个JNI应用程序。
我想从我的JNI代码中调用一个用于更新UI的Java函数。
基本上,当我收到回调并尝试获取对环境的引用时,我得到一个类型的错误: Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.