Crash in JNI when call "JAVAVM->GetEnv((void**)env, JNI_VERSION_1_4)"

I’m using cocos2d-2.0-x-2.0.3,
at the beginning, my game can successfully run on my Android mobile,
but after I added some new sources, it became to fail to run on mobile…
I tried to investigate it, and found it seemed crash in the following source of NDK header file “jni.h”.

  • line 1077
    jint GetEnv(void*** env, jint version)
    { return functions->GetEnv; }
    **

btw, I didn’t use the default compile flow of cocos2d-x,
instead, I compiled all libs as PREBUILT_STATIC_LIBRARY from cocos2d-x source,
and then link them into my own game.
it doesn’t matter?

=

(So sorry for my replacing game package name in log, because it contains my company info…)
The original logs from LogCat:

I/DEBUG ( 1008): ** ** ** ** ** ** ** **
I/DEBUG ( 1008): Build fingerprint: ‘lge/lge_star/p990/p990:2.2.2/FRG83G/lgp990-V10b.2ED2ADCFFC:user/release-keys’
I/DEBUG ( 1008): pid: 3223, tid: 3223 >>> com.test.game <<<
I/DEBUG ( 1008): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG ( 1008): r0 00000000 r1 beaed3d8 r2 00010004 r3 00000000
I/DEBUG ( 1008): r4 beaed41c r5 00000000 r6 beaed4e0 r7 4214cc98
I/DEBUG ( 1008): r8 beaed428 r9 4214cc90 10 0000abe0 fp 00000001
I/DEBUG ( 1008): ip 8053e469 sp beaed398 lr 8053eea3 pc 8053ea8c cpsr 00000030
I/DEBUG ( 1008): d0 414000003f800000 d1 3ff0000043160000
I/DEBUG ( 1008): d2 4d83c2dc4248a157 d3 00540ff04a28a780
I/DEBUG ( 1008): d4 3fbc71c7002a29e0 d5 3fe999999999999a
I/DEBUG ( 1008): d6 3fe8000000000000 d7 408000003f4ccccd
I/DEBUG ( 1008): d8 0000000000000000 d9 0000000000000000
I/DEBUG ( 1008): d10 0000000000000000 d11 0000000000000000
I/DEBUG ( 1008): d12 0000000000000000 d13 0000000000000000
I/DEBUG ( 1008): d14 0000000000000000 d15 0000000000000000
I/DEBUG ( 1008): scr 20000010
I/DEBUG ( 1008):
D/NOTIFICATION: ignore a notification because of not accepted
D/APP_SERVICE: app notification failed
I/DEBUG ( 1008): #00 pc 0013ea8c /data/data/com.test.game/lib/libgame.so (*ZN7_JavaVM6GetEnvEPPvi)
I/DEBUG : #01 pc 0013ee9e /data/data/com.test.game/lib/libgame.so
I/DEBUG : #02 pc 0013f114 /data/data/com.test.game/lib/libgame.so
I/DEBUG : #03 pc 0013f294 /data/data/com.test.game/lib/libgame.so
I/DEBUG : #04 pc 0013e47e /data/data/com.test.game/lib/libgame.so
I/DEBUG : #05 pc 00011e74 /system/lib/libdvm.so
I/DEBUG : #06 pc 00043414 /system/lib/libdvm.so
I/DEBUG : #07 pc 00048bc6 /system/lib/libdvm.so
I/DEBUG : #08 pc 00017088 /system/lib/libdvm.so
I/DEBUG : #09 pc 0001c0d0 /system/lib/libdvm.so
I/DEBUG : #10 pc 0001afb8 /system/lib/libdvm.so
I/DEBUG : #11 pc 00059b36 /system/lib/libdvm.so
I/DEBUG : #12 pc 0006183e /system/lib/libdvm.so
I/DEBUG : #13 pc 00017088 /system/lib/libdvm.so
I/DEBUG : #14 pc 0001c0d0 /system/lib/libdvm.so
I/DEBUG : #15 pc 0001afb8 /system/lib/libdvm.so
I/DEBUG : #16 pc 00059994 /system/lib/libdvm.so
I/DEBUG : #17 pc 00045e92 /system/lib/libdvm.so
I/DEBUG : #18 pc 0003185a /system/lib/libandroid_runtime.so
I/DEBUG : #19 pc 00032706 /system/lib/libandroid_runtime.so
I/DEBUG : #20 pc 00008cca /system/bin/app_process
I/DEBUG : #21 pc 000152c2 /system/lib/libc.so

And I also tried to use *ndk-stack* to translate them,

********** Crash dump: **********
Build fingerprint: ‘lge/lge_star/p990/p990:2.2.2/FRG83G/lgp990-V10b.2ED2ADCFFC:user/release-keys’
pid: 3120, tid: 3120 >>> com.test.game <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
Stack frame #00 pc 0013ea8c /data/data/com.test.game/lib/libgame.so (_ZN7_JavaVM6GetEnvEPPvi): Routine GetEnv in D:/work/Android_NDK/android-ndk-r8/platforms/android-8/arch-arm/usr/include/jni.h:1077
Stack frame #01 pc 0013ee9e /data/data/com.test.game/lib/libgame.so: Routine getEnv in D:/work/cocos2d-x_test/cocos2d-x/2.0.3/source/samples/HelloCpp/proj.android/…/…/…/cocos2dx/platform/android/jni/JniHelper.cpp:52
Stack frame #02 pc 0013f114 /data/data/com.test.game/lib/libgame.so: Routine jstring2string_ in D:/work/cocos2d-x_test/cocos2d-x/2.0.3/source/samples/HelloCpp/proj.android/…/…/…/cocos2dx/platform/android/jni/JniHelper.cpp:169
Stack frame #03 pc 0013f294 /data/data/com.test.game/lib/libgame.so (_ZN7cocos2d9JniHelper14jstring2stringEP8_jstring): Routine jstring2string in D:/work/cocos2d-x_test/cocos2d-x/2.0.3/source/samples/HelloCpp/proj.android/…/…/…/cocos2dx/platform/android/jni/JniHelper.cpp:223
Stack frame #04 pc 0013e47e /data/data/com.test.game/lib/libgame.so (Java_org_cocos2dx_lib_Cocos2dxHelper_nativeSetApkPath): Routine Java_org_cocos2dx_lib_Cocos2dxHelper_nativeSetApkPath in D:/work/cocos2d-x_test/cocos2d-x/2.0.3/source/samples/HelloCpp/proj.android/…/…/…/cocos2dx/platform/android/jni/Java_org_cocos2dx_lib_Cocos2dxHelper.cpp:25
Stack frame #05 pc 00011e74 /system/lib/libdvm.so
Stack frame #06 pc 00043414 /system/lib/libdvm.so (dvmCallJNIMethod_general)
Stack frame #07 pc 00048bc6 /system/lib/libdvm.so (dvmResolveNativeMethod)
Stack frame #08 pc 00017088 /system/lib/libdvm.so
Stack frame #09 pc 0001c0d0 /system/lib/libdvm.so (dvmMterpStd)
Stack frame #10 pc 0001afb8 /system/lib/libdvm.so (dvmInterpret)
Stack frame #11 pc 00059b36 /system/lib/libdvm.so (dvmInvokeMethod)
Stack frame #12 pc 0006183e /system/lib/libdvm.so
Stack frame #13 pc 00017088 /system/lib/libdvm.so
Stack frame #14 pc 0001c0d0 /system/lib/libdvm.so (dvmMterpStd)
Stack frame #15 pc 0001afb8 /system/lib/libdvm.so (dvmInterpret)
Stack frame #16 pc 00059994 /system/lib/libdvm.so (dvmCallMethodV)
Stack frame #17 pc 00045e92 /system/lib/libdvm.so
Stack frame #18 pc 0003185a /system/lib/libandroid_runtime.so
Stack frame #19 pc 00032706 /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime5startEPKcb)
Stack frame #20 pc 00008cca /system/bin/app_process
Stack frame #21 pc 000152c2 /system/lib/libc.so (__libc_init)
Crash dump is completed

=
And this is my source form NDK jni.h

/*
* C++ version.
*/
struct*JavaVM {
const struct JNIInvokeInterface* functions;

#if defined(*cplusplus)
jint DestroyJavaVM
{ return functions~~>DestroyJavaVM; }
jint AttachCurrentThread
{ return functions~~>AttachCurrentThread; }
jint DetachCurrentThread
{ return functions~~>DetachCurrentThread; }
jint GetEnv
{ return functions~~>GetEnv; }
jint AttachCurrentThreadAsDaemon
{ return functions->AttachCurrentThreadAsDaemon; }
#endif /**cplusplus*/
};

Hi, I am not a expert of Android (infact I don’t have any answer at my questions from forum… :frowning: http://www.cocos2d-x.org/boards/6/topics/18068 )…
But from your log… I suppose that:

jint GetEnv(void*** env, jint version) { return functions~~>GetEnv; } *
there is “functions” or another variable = NULL… I suppose, because there is a fault adds 0x00000000.

I/DEBUG : signal 11 , code 1 , fault addr 00000000

try make a test for any variables on your code:
jint GetEnv
{
if
CCLOGERROR (“functions == NULL”)
if)
CCLOGERROR ("env == NULL)
return functions~~>GetEnv;
}
sorry, I am new at Android World!

I/DEBUG : Build fingerprint: ‘lge/lge_star/p990/p990:2.2.2/FRG83G/lgp990-V10b.2ED2ADCFFC:user/release-keys’
I/DEBUG : pid: 3223, tid: 3223 >>> com.test.game <<<
I/DEBUG : signal 11 , code 1 , fault addr 00000000
I/DEBUG : r0 00000000 r1 beaed3d8 r2 00010004 r3 00000000
I/DEBUG : r4 beaed41c r5 00000000 r6 beaed4e0 r7 4214cc98
I/DEBUG : r8 beaed428 r9 4214cc90 10 0000abe0 fp 00000001
I/DEBUG : ip 8053e469 sp beaed398 lr 8053eea3 pc 8053ea8c cpsr 00000030
I/DEBUG : d0 414000003f800000 d1 3ff0000043160000
I/DEBUG : d2 4d83c2dc4248a157 d3 00540ff04a28a780
I/DEBUG : d4 3fbc71c7002a29e0 d5 3fe999999999999a
I/DEBUG : d6 3fe8000000000000 d7 408000003f4ccccd
I/DEBUG : d8 0000000000000000 d9 0000000000000000
I/DEBUG : d10 0000000000000000 d11 0000000000000000
I/DEBUG : d12 0000000000000000 d13 0000000000000000
I/DEBUG : d14 0000000000000000 d15 0000000000000000
I/DEBUG : scr 20000010
I/DEBUG :
D/[NOTIFICATION]: ignore a notification because of not accepted
D/[APP_SERVICE]: app notification failed
I/DEBUG : #00 pc 0013ea8c /data/data/com.test.game/lib/libgame.so
I/DEBUG : #01 pc 0013ee9e /data/data/com.test.game/lib/libgame.so
I/DEBUG : #02 pc 0013f114 /data/data/com.test.game/lib/libgame.so
I/DEBUG : #03 pc 0013f294 /data/data/com.test.game/lib/libgame.so
I/DEBUG : #04 pc 0013e47e /data/data/com.test.game/lib/libgame.so
I/DEBUG : #05 pc 00011e74 /system/lib/libdvm.so
I/DEBUG : #06 pc 00043414 /system/lib/libdvm.so
I/DEBUG : #07 pc 00048bc6 /system/lib/libdvm.so
I/DEBUG : #08 pc 00017088 /system/lib/libdvm.so
I/DEBUG : #09 pc 0001c0d0 /system/lib/libdvm.so
I/DEBUG : #10 pc 0001afb8 /system/lib/libdvm.so
I/DEBUG : #11 pc 00059b36 /system/lib/libdvm.so
I/DEBUG : #12 pc 0006183e /system/lib/libdvm.so
I/DEBUG : #13 pc 00017088 /system/lib/libdvm.so
I/DEBUG : #14 pc 0001c0d0 /system/lib/libdvm.so
I/DEBUG : #15 pc 0001afb8 /system/lib/libdvm.so
I/DEBUG : #16 pc 00059994 /system/lib/libdvm.so
I/DEBUG : #17 pc 00045e92 /system/lib/libdvm.so
I/DEBUG : #18 pc 0003185a /system/lib/libandroid_runtime.so
I/DEBUG : #19 pc 00032706 /system/lib/libandroid_runtime.so
I/DEBUG : #20 pc 00008cca /system/bin/app_process
I/DEBUG : #21 pc 000152c2 /system/lib/libc.so
>
>
>
And I also tried to use *ndk-stack* to translate them,

********** Crash dump: **********
Build fingerprint: ‘lge/lge_star/p990/p990:2.2.2/FRG83G/lgp990-V10b.2ED2ADCFFC:user/release-keys’
pid: 3120, tid: 3120 >>> com.test.game <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
Stack frame #00 pc 0013ea8c /data/data/com.test.game/lib/libgame.so (_ZN7_JavaVM6GetEnvEPPvi): Routine GetEnv in D:/work/Android_NDK/android-ndk-r8/platforms/android-8/arch-arm/usr/include/jni.h:1077
Stack frame #01 pc 0013ee9e /data/data/com.test.game/lib/libgame.so: Routine getEnv in D:/work/cocos2d-x_test/cocos2d-x/2.0.3/source/samples/HelloCpp/proj.android/…/…/…/cocos2dx/platform/android/jni/JniHelper.cpp:52
Stack frame #02 pc 0013f114 /data/data/com.test.game/lib/libgame.so: Routine jstring2string_ in D:/work/cocos2d-x_test/cocos2d-x/2.0.3/source/samples/HelloCpp/proj.android/…/…/…/cocos2dx/platform/android/jni/JniHelper.cpp:169
Stack frame #03 pc 0013f294 /data/data/com.test.game/lib/libgame.so (_ZN7cocos2d9JniHelper14jstring2stringEP8_jstring): Routine jstring2string in D:/work/cocos2d-x_test/cocos2d-x/2.0.3/source/samples/HelloCpp/proj.android/…/…/…/cocos2dx/platform/android/jni/JniHelper.cpp:223
Stack frame #04 pc 0013e47e /data/data/com.test.game/lib/libgame.so (Java_org_cocos2dx_lib_Cocos2dxHelper_nativeSetApkPath): Routine Java_org_cocos2dx_lib_Cocos2dxHelper_nativeSetApkPath in D:/work/cocos2d-x_test/cocos2d-x/2.0.3/source/samples/HelloCpp/proj.android/…/…/…/cocos2dx/platform/android/jni/Java_org_cocos2dx_lib_Cocos2dxHelper.cpp:25
Stack frame #05 pc 00011e74 /system/lib/libdvm.so
Stack frame #06 pc 00043414 /system/lib/libdvm.so (dvmCallJNIMethod_general)
Stack frame #07 pc 00048bc6 /system/lib/libdvm.so (dvmResolveNativeMethod)
Stack frame #08 pc 00017088 /system/lib/libdvm.so
Stack frame #09 pc 0001c0d0 /system/lib/libdvm.so (dvmMterpStd)
Stack frame #10 pc 0001afb8 /system/lib/libdvm.so (dvmInterpret)
Stack frame #11 pc 00059b36 /system/lib/libdvm.so (dvmInvokeMethod)
Stack frame #12 pc 0006183e /system/lib/libdvm.so
Stack frame #13 pc 00017088 /system/lib/libdvm.so
Stack frame #14 pc 0001c0d0 /system/lib/libdvm.so (dvmMterpStd)
Stack frame #15 pc 0001afb8 /system/lib/libdvm.so (dvmInterpret)
Stack frame #16 pc 00059994 /system/lib/libdvm.so (dvmCallMethodV)
Stack frame #17 pc 00045e92 /system/lib/libdvm.so
Stack frame #18 pc 0003185a /system/lib/libandroid_runtime.so
Stack frame #19 pc 00032706 /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime5startEPKcb)
Stack frame #20 pc 00008cca /system/bin/app_process
Stack frame #21 pc 000152c2 /system/lib/libc.so (__libc_init)
Crash dump is completed

=
And this is my source form NDK jni.h
>
>
/**
* C++ version.
*/
struct JavaVM {
const struct JNIInvokeInterface* functions;
>
#if defined
jint DestroyJavaVM
{ return functions~~>DestroyJavaVM; }
jint AttachCurrentThread
{ return functions~~>AttachCurrentThread; }
jint DetachCurrentThread
{ return functions~~>DetachCurrentThread; }
jint GetEnv
{ return functions~~>GetEnv; }
jint AttachCurrentThreadAsDaemon
{ return functions->AttachCurrentThreadAsDaemon; }
#endif /*
_cplusplus*/
};

I resolved it…

because I mistakenly removed JNI_OnLoad() from Android.mk…