【发布时间】:2011-11-10 13:04:34
【问题描述】:
我目前正在做一个更大的项目,在本机环境中使用多个线程。因此,我需要调用 (*vm)->GetEnv 来接收本机线程当前活动的 JNIEnv。线程在创建时附加,但我在调用 GetEnv 的方法中添加了故障转移:
void get_jni_env(void **e) {
JNIEnv *env = malloc(sizeof(JNIEnv *));
if((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK) {
__android_log_write(ANDROID_LOG_ERROR, "Call to GetEnv from a unattached native thread. Trying to attach thread.");
if((*vm)->AttachCurrentThread(vm, &env, NULL) != JNI_OK) {
__android_log_write(ANDROID_LOG_ERROR, "Failed to receive any jni environment. Crashing soon");
}
}
*e = env;
}
当你看到对 (*vm)->GetEnv segfaults 的调用:
jni_get_long (ctx=0x40525080, key=0x804215e0 "hm") at jni/jni.c:50
50 GET_JNI_ENV(&env);
(gdb) s
get_jni_env (e=0xbec603e8) at jni/../../../../core/android/util.c:159
159 if((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK) {
(gdb) n
156 void get_jni_env(void **e) {
(gdb)
157 JNIEnv *env = malloc(sizeof(JNIEnv *));
(gdb)
159 if((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK) {
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0xaca43510 in ?? () ← this is somewhere on the heap
相同的代码在三星和索尼爱立信设备以及模拟器上运行良好。对于这个特定的错误,我有点想不通。我还用 CyanogenMod 7.1 测试了一个 HTC 设备,它应该与 AOSP android 非常相似,即使在同一点上它也会崩溃。
【问题讨论】:
标签: android segmentation-fault java-native-interface