[fpc-pascal] JNI crash
Felipe Monteiro de Carvalho
felipemonteiro.carvalho at gmail.com
Mon Nov 28 09:58:24 CET 2011
Hello,
This question is mostly directed to Benjamin since I think that few
people work here with JNI, but I thought that the answer (if I get
one) is of general usage.
So, basically I am now trying to explore JNI, but my application
crashes right in the start, inside JNI_OnLoad:
function JNI_OnLoad(vm:PJavaVM;reserved:pointer):jint; cdecl;
var
curVM:PJavaVM=nil;
curEnv:PJNIEnv=nil;
begin
curVM:=vm;
__android_log_write(ANDROID_LOG_INFO,'nativetest','JNI_OnLoad called');
__android_log_write(ANDROID_LOG_INFO,'nativetest',PChar(Format('CurVM=%x',
[PtrInt(CurVM)])));
__android_log_write(ANDROID_LOG_INFO,'nativetest',PChar(Format('CurVM^=%x',
[PtrInt(CurVM^)])));
__android_log_write(ANDROID_LOG_INFO,'nativetest',PChar(Format('CurVM^^.reserved0=%x',
[PtrInt(CurVM^^.reserved0)])));
__android_log_write(ANDROID_LOG_INFO,'nativetest',PChar(Format('CurVM^^.GetEnv=%x',
[PtrInt(Pointer(@CurVM^^.GetEnv))])));
if curVM^^.GetEnv(curVM, at curEnv,JNI_VERSION_1_4)<>JNI_OK then begin
//<<<--- THIS CRASHES
__android_log_write(ANDROID_LOG_INFO{FATAL},'nativetest','curVM^.GetEnv
failed'); <- never shows
// result:=JNI_ERR;
// exit;
end;
What amazes me is that everything looks perfect. I verified the jni
bindings against my jni.h from the ndk and I couldn't find any error.
I can even access CurVM^^.reserved0 and also the value of GetEnv as a
pointer (see all values in the log bellow), but still it crashes
there.
I searched google and I couldn't find people having issues with that
in C / C++, only when people create their own threads, but my
application is absolutely not creating any threads.
The full source for testing is
lazarus-ccr/bindings/android-ndk/examples/jnitest just uncomment the
code inside JNI_Onload
Another thing that puzzles me is that in
lazarus-ccr/bindings/android-ndk/examples/jnitest I could call the
method IntFromJNI even while nearly everything from JNI_OnLoad is
commented, but when I try to call this method (which is in
LCL-CustomDrawn, not in that example):
function Java_com_pascal_jnitest_AndroidJNITest_LCLDrawToBitmap(
env:PJNIEnv;this:jobject; width, height: jint; abitmap: jobject):
jint; cdecl;
Then I get a Java error that the routine could not be found ... very
strange, it should fail in both cases because none of them achieves
registering the methods.
D/dalvikvm(14150): GC_EXPLICIT freed 1701 objects / 120544 bytes in 412ms
I/ActivityManager( 102): Starting activity: Intent {
act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
flg=0x10200000 cmp=com.pascal.lcltest/.LCLActivity }
I/ActivityManager( 102): Start proc com.pascal.lcltest for activity
com.pascal.lcltest/.LCLActivity: pid=15168 uid=10072 gids={}
I/JNI (15168): Trying to load liblclapp.so
D/dalvikvm(15168): Trying to load lib
/data/data/com.pascal.lcltest/lib/liblclapp.so 0x44929a80
W/Rosie (22307): mAddHtcWidgetByOtherActivity = false,
mIsOpenSlideWhenLeaveLaunch = true
D/dalvikvm(15168): Added shared lib
/data/data/com.pascal.lcltest/lib/liblclapp.so 0x44929a80
I/nativetest(15168): JNI_OnLoad called
I/nativetest(15168): CurVM=AA00
I/nativetest(15168): CurVM^=80889094
I/nativetest(15168): CurVM^^.reserved0=0
I/nativetest(15168): CurVM^^.GetEnv=808890AC
I/DEBUG ( 69): *** *** *** *** *** *** *** *** *** *** *** *** ***
*** *** ***
I/DEBUG ( 69): Build fingerprint:
'htc_wwe/htc_buzz/buzz/buzz:2.2.1/FRG83D/295397:user/release-keys'
I/DEBUG ( 69): pid: 15168, tid: 15168 >>> com.pascal.lcltest <<<
I/DEBUG ( 69): thread: .pascal.lcltest
I/DEBUG ( 69): signal 4 (SIGILL), fault addr 8083e098
I/DEBUG ( 69): r0 0000aa00 r1 be966738 r2 00010004 r3 80889094
I/DEBUG ( 69): r4 8083e099 r5 0000cd58 r6 810aefb0 r7 000a6238
I/DEBUG ( 69): r8 80813e00 r9 0000cd58 10 41056c04 fp be966774
I/DEBUG ( 69): ip afa030c8 sp be9666d8 lr 810e23fc pc 8083e098
cpsr 00000010
I/DEBUG ( 69): #00 pc 0003e098 /system/lib/libdvm.so
I/DEBUG ( 69): #01 lr 810e23fc
/data/data/com.pascal.lcltest/lib/liblclapp.so
I/DEBUG ( 69):
I/DEBUG ( 69): code around pc:
I/DEBUG ( 69): 8083e078 fffe8475 6904b510 1c202101 fbd8f009
I/DEBUG ( 69): 8083e088 21071c20 fbd4f009 bd104800 00010006
I/DEBUG ( 69): 8083e098 1c16b570 f0091c0d 4b0dfb47 20031c04
I/DEBUG ( 69): 8083e0a8 2e0518f6 2c00d812 602cd101 2101e009
I/DEBUG ( 69): 8083e0b8 f0091c20 6ba0fbbd 60282107 f0091c20
I/DEBUG ( 69):
I/DEBUG ( 69): code around lr:
I/DEBUG ( 69): 810e23dc e3a02801 e3822004 e51b0038 e51b3038
I/DEBUG ( 69): 810e23ec e5933000 e5934018 e1a0e00f e1a0f004
I/DEBUG ( 69): 810e23fc e3500000 159f2198 159f117c 13a00004
I/DEBUG ( 69): 810e240c 1bff32d2 e59f218c e59f116c e3a00004
I/DEBUG ( 69): 810e241c ebff32ce e59f1180 e51b003c e51b203c
I/DEBUG ( 69):
I/DEBUG ( 69): stack:
I/DEBUG ( 69): be966698 afa0109d /system/lib/liblog.so
I/DEBUG ( 69): be96669c afa012f1 /system/lib/liblog.so
I/DEBUG ( 69): be9666a0 00000000
I/DEBUG ( 69): be9666a4 00000004
I/DEBUG ( 69): be9666a8 be9666a4 [stack]
I/DEBUG ( 69): be9666ac 00000001
I/DEBUG ( 69): be9666b0 81367514
/data/data/com.pascal.lcltest/lib/liblclapp.so
I/DEBUG ( 69): be9666b4 0000000b
I/DEBUG ( 69): be9666b8 002377cc [heap]
I/DEBUG ( 69): be9666bc 00000018
I/DEBUG ( 69): be9666c0 b000c4a8 /system/bin/linker
I/DEBUG ( 69): be9666c4 8088a018 /system/lib/libdvm.so
I/DEBUG ( 69): be9666c8 0000cd58 [heap]
I/DEBUG ( 69): be9666cc 810aefb0
/data/data/com.pascal.lcltest/lib/liblclapp.so
I/DEBUG ( 69): be9666d0 000a6238 [heap]
I/DEBUG ( 69): be9666d4 810e23d8
/data/data/com.pascal.lcltest/lib/liblclapp.so
I/DEBUG ( 69): #00 be9666d8 41056c04
I/DEBUG ( 69): be9666dc b0001dbb /system/bin/linker
I/DEBUG ( 69): be9666e0 b00134dc
I/DEBUG ( 69): be9666e4 00000000
I/DEBUG ( 69): be9666e8 002377cc [heap]
I/DEBUG ( 69): be9666ec 0023777c [heap]
I/DEBUG ( 69): be9666f0 00237814 [heap]
I/DEBUG ( 69): be9666f4 00000000
I/DEBUG ( 69): be9666f8 808890ac /system/lib/libdvm.so
I/DEBUG ( 69): be9666fc 002377ac [heap]
I/DEBUG ( 69): be966700 00000000
I/DEBUG ( 69): be966704 8088a018 /system/lib/libdvm.so
I/DEBUG ( 69): be966708 0000cd58 [heap]
I/DEBUG ( 69): be96670c 810aefb0
/data/data/com.pascal.lcltest/lib/liblclapp.so
I/DEBUG ( 69): be966710 000a6238 [heap]
I/DEBUG ( 69): be966714 80813e00 /system/lib/libdvm.so
I/DEBUG ( 69): be966718 0000cd58 [heap]
I/DEBUG ( 69): be96671c 41056c04
I/ActivityManager( 102): Process com.pascal.lcltest (pid 15168) has died.
--
Felipe Monteiro de Carvalho
More information about the fpc-pascal
mailing list