我开始使用Android-NDK了。所以我们在这里遇到了一个问题。 这是C文件:
#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;
}
这里是Java文件:
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());
}
}
问题是应用程序崩溃了。这里的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.
有什么想法吗?它似乎是一个缓冲区溢出,但是什么?提前谢谢。
答案 0 :(得分:2)
您必须在.c文件中包含生成的.h文件,否则您的本机方法将没有正确的调用序列修饰符。
答案 1 :(得分:1)
这可能不会导致崩溃,但testNDK
行应TestNDK
Java_com_gnufabio_ndk_test_testNDK_buildString
以匹配您的班级名称。
答案 2 :(得分:0)
您正在寻找的是:
jstring str_ret = env->NewStringUTF(STRING);