我目前正在使用本地环境中的多线程工作。因此,我需要调用(* vm) - > GetEnv来接收本地线程的当前活动的JNIEnv。螺纹连接上创建,但我添加了一个故障转移中调用getenv的方法:把你看透了(* vm) - >仅在HTC设备上使用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段错误:
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非常相似,即使在同一点上它也会崩溃。
那么可以忽略。我尝试了解它是否由堆栈中的某些错误地址引起,并将malloc()的地址移至堆中。但这个问题似乎在别的地方。你的版本也不行,我已经预先试过了。但是谢谢你花时间回答。 – lhw