JNI: jstring make the app crash on android
I'm getting started with Android-NDK. So here we are, with a problem. This 开发者_运维百科is the C file:
#include <string.h>
#include <jni.h>
#include <stdio.h>
#define STRING "test"
jstring Java_com_gnufabio_ndk_test_testNDK_buildString(JNIEnv *env, jobject sThis){
jstring str_ret = (*env)->NewStringUTF(env, STRING);
return str_ret;
}
And here the Java file:
package com.gnufabio.ndk.test;
import android.app.Activity;
import android.os.Bundle;
import android.text.style.BulletSpan;
import android.util.Log;
public class TestNDK extends Activity {
/** Called when the activity is first created. */
static {
System.loadLibrary("test");
}
public native String buildString();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start();
}
public void start (){
Log.d("NDK-TEST", "Started at: " + System.currentTimeMillis());
for (int i=0; i < 9999; i++){
buildString();
}
Log.d("NDK-TEST", "Finished at: " + System.currentTimeMillis());
}
}
The problem is that the app crashes. Here the logcat:
I/DEBUG ( 86): pid: 1635, tid: 1637 >>> com.gnufabio.ndk.test <<< I/DEBUG ( 86): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad I/DEBUG ( 86): r0 deadbaad r1 00000001 r2 a0000000 r3 00000000 I/DEBUG ( 86): r4 00000000 r5 00000027 r6 0000f140 r7 40875418 I/DEBUG ( 86): r8 100ffe5c r9 100ffe88 10 000b3f50 fp acaa149c I/DEBUG ( 86): ip ffffffff sp 100ffde0 lr aff194ad pc aff15c1c cpsr 60000030 I/DEBUG ( 86): d0 400000003eaaaaab d1 0000005f3f800000 I/DEBUG ( 86): d2 4e194b6842be630c d3 42c8000000670ff0 I/DEBUG ( 86): d4 000001fd00621bc8 d5 3fe999999999999a I/DEBUG ( 86): d6 3ff0000000000000 d7 3eaaaaab3f800000 I/DEBUG ( 86): d8 0000000000000000 d9 0000000000000000 I/DEBUG ( 86): d10 0000000000000000 d11 0000000000000000 I/DEBUG ( 86): d12 0000000000000000 d13 0000000000000000 I/DEBUG ( 86): d14 0000000000000000 d15 0000000000000000 I/DEBUG ( 86): scr 80000012 I/DEBUG ( 86): I/DEBUG ( 86): #00 pc 00015c1c /system/lib/libc.so I/DEBUG ( 86): #01 pc 00013efe /system/lib/libc.so (dlfree) I/DEBUG ( 86): #02 pc 0001445c /system/lib/libc.so (free) I/DEBUG ( 86): #03 pc 0004cfc8 /system/lib/libdvm.so (dexDataMapFree) I/DEBUG ( 86): #04 pc 0004cff4 /system/lib/libdvm.so (dvmHeapGetNextObjectFromLargeTable) I/DEBUG ( 86): #05 pc 0001a070 /system/lib/libdvm.so (dvmGetNextHeapWorkerObject) I/DEBUG ( 86): #06 pc 0004d530 /system/lib/libdvm.so I/DEBUG ( 86): #07 pc 0004d682 /system/lib/libdvm.so I/DEBUG ( 86): #08 pc 0004be0e /system/lib/libdvm.so I/DEBUG ( 86): #09 pc 00011980 /system/lib/libc.so (__thread_entry) I/DEBUG ( 86): #10 pc 000114d4 /system/lib/libc.so (pthread_create) I/DEBUG ( 86): I/DEBUG ( 86): libc base address: aff00000 I/DEBUG ( 86): I/DEBUG ( 86): code around pc: I/DEBUG ( 86): aff15bfc 4623b15c 2c006824 e026d1fb b12368db I/DEBUG ( 86): aff15c0c 21014a17 6011447a 48124798 24002527 I/DEBUG ( 86): aff15c1c f7f57005 2106eb8a ec18f7f6 460aa901 I/DEBUG ( 86): aff15c2c f04f2006 94015380 94029303 efe2f7f5 I/DEBUG ( 86): aff15c3c 4622a905 f7f52002 f7f5efec 2106eb76 I/DEBUG ( 86): I/DEBUG ( 86): code around lr: I/DEBUG ( 86): aff1948c 41f0e92d 46804c0c 447c2600 68a56824 I/DEBUG ( 86): aff1949c e0076867 300cf9b5 dd022b00 47c04628 I/DEBUG ( 86): aff194ac 35544306 37fff117 6824d5f4 d1ee2c00 I/DEBUG ( 86): aff194bc e8bd4630 bf0081f0 0002802e 41f0e92d I/DEBUG ( 86): aff194cc fb01b086 9004f602 461f4815 4615460c I/DEBUG ( 86): I/DEBUG ( 86): stack: I/DEBUG ( 86): 100ffda0 00000000 I/DEBUG ( 86): 100ffda4 00000000 I/DEBUG ( 86): 100ffda8 00000000 I/DEBUG ( 86): 100ffdac 00000000 I/DEBUG ( 86): 100ffdb0 aff41700 I/DEBUG ( 86): 100ffdb4 aff41690 I/DEBUG ( 86): 100ffdb8 00000000 I/DEBUG ( 86): 100ffdbc aff194ad /system/lib/libc.so I/DEBUG ( 86): 100ffdc0 00000000 I/DEBUG ( 86): 100ffdc4 100ffdf4 I/DEBUG ( 86): 100ffdc8 0000f140 I/DEBUG ( 86): 100ffdcc 40875418 I/DEBUG ( 86): 100ffdd0 100ffe5c I/DEBUG ( 86): 100ffdd4 aff18619 /system/lib/libc.so I/DEBUG ( 86): 100ffdd8 df002777 I/DEBUG ( 86): 100ffddc e3a070ad I/DEBUG ( 86): #00 100ffde0 aca9b64c I/DEBUG ( 86): 100ffde4 aca57f6d /system/lib/libdvm.so I/DEBUG ( 86): 100ffde8 00139958 I/DEBUG ( 86): 100ffdec 4087ca40 I/DEBUG ( 86): 100ffdf0 00139958 I/DEBUG ( 86): 100ffdf4 fffffbdf I/DEBUG ( 86): 100ffdf8 100ffe5c I/DEBUG ( 86): 100ffdfc 00000004 I/DEBUG ( 86): 100ffe00 00000018 I/DEBUG ( 86): 100ffe04 aff13f03 /system/lib/libc.so I/DEBUG ( 86): #01 100ffe08 00139958 I/DEBUG ( 86): 100ffe0c 4087ca40 I/DEBUG ( 86): 100ffe10 00000000 I/DEBUG ( 86): 100ffe14 402441e8 I/DEBUG ( 86): 100ffe18 100ffe5c I/DEBUG ( 86): 100ffe1c aff1445f /system/lib/libc.so I/BootReceiver( 164): Copying /data/tombstones/tombstone_08 to DropBox (SYSTEM_TOMBSTONE) D/Zygote ( 88): Process 1635 terminated by signal (11) I/ActivityManager( 164): Process com.gnufabio.ndk.test (pid 1635) has died.
Any idea? It seems that it's a buffer overflow, but of what? Thanks in advance.
You must include the generated .h file in your .c file, otherwise your native method won't have the correct calling sequence modifiers.
This probably isn't causing the crash but testNDK
should be TestNDK
in the line Java_com_gnufabio_ndk_test_testNDK_buildString
to match your class name.
What you are looking for is:
jstring str_ret = env->NewStringUTF(STRING);
精彩评论