JNI: jstring вызывает сбой приложения на Android - PullRequest
1 голос
/ 15 октября 2011

Я начинаю с 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());
    }
}

Проблема в том, что приложение вылетает.Вот лог:

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 ]

2 голосов
/ 16 октября 2011

Вы должны включить сгенерированный файл .h в ваш файл .c, иначе ваш нативный метод не будет иметь правильных модификаторов последовательности вызова.

1 голос
/ 19 октября 2011

Это, вероятно, не вызывает сбой, но testNDK должно быть TestNDK в строке Java_com_gnufabio_ndk_test_testNDK_buildString, чтобы соответствовать имени вашего класса.

0 голосов
/ 15 октября 2011

То, что вы ищете:

jstring str_ret = env->NewStringUTF(STRING);
...