JNI:jstring使应用程序崩溃在android上

时间:2011-10-14 20:04:34

标签: java android c java-native-interface android-ndk

我开始使用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.

有什么想法吗?它似乎是一个缓冲区溢出,但是什么?提前谢谢。

3 个答案:

答案 0 :(得分:2)

您必须在.c文件中包含生成的.h文件,否则您的本机方法将没有正确的调用序列修饰符。

答案 1 :(得分:1)

这可能不会导致崩溃,但testNDK行应TestNDK Java_com_gnufabio_ndk_test_testNDK_buildString以匹配您的班级名称。

答案 2 :(得分:0)

您正在寻找的是:

jstring str_ret = env->NewStringUTF(STRING);