1

次のコードでセグメンテーション違反が発生しています。

#include <stddef.h>
#include <android/log.h>
#include "com_backyardbrains_drawing_BybGLDrawable.h"

#define ALOG(msg) __android_log_print(ANDROID_LOG_DEBUG, "NDK:BYB", msg)
#define AERR(msg) __android_log_print(ANDROID_LOG_ERROR, "NDK:BYB", msg)

JNIEXPORT jfloatArray JNICALL
Java_com_backyardbrains_drawing_BybGLDrawable_interleaveXvalues
(JNIEnv *env, jclass clazz, jshortArray shortArrayToDraw) {
ALOG("called interleave");

    jfloatArray result;
    jsize len = (*env)->GetArrayLength(env, shortArrayToDraw);
    __android_log_print(ANDROID_LOG_DEBUG, "NDK:BYB",
                       "Got input length of %d", len);
    jshort *valuesjs = (*env)->GetShortArrayElements(env, shortArrayToDraw, NULL);
    if (valuesjs == NULL || !(len > 0)) {
        return NULL;
    }
    jfloat tmp[len*2];
    __android_log_print(ANDROID_LOG_DEBUG, "NDK:BYB",
                  "made a new tmp array of size %d",
                  sizeof(tmp)/sizeof(jfloat));
    // Create the returnable 2D array
    result = (*env)->NewFloatArray(env, len*2);
    if (result == NULL) {
        AERR("could not allocate result");
        return NULL;
    }

    int i;
    for (i = 0; i < len; i++) {
        tmp[i*2] = i;
        tmp[i*2+1] = valuesjs[i];
        __android_log_print(ANDROID_LOG_DEBUG, "NDK:BYB", "Set element %d", i);
    }
    ALOG("Finished building new array");

    (*env)->ReleaseShortArrayElements(env, shortArrayToDraw, valuesjs, 0);
    ALOG("released old short array");

    (*env)->SetFloatArrayRegion(env, result, 0, len*2, tmp);
    ALOG("set new float array");
    return result;

}

ログ出力は次のようになります。

06-19 21:34:24.829 29156 29172 D NDK:BYB : called interleave
06-19 21:34:24.829 29156 29172 D NDK:BYB : Got input length of 131072
06-19 21:34:24.829 29156 29172 D NDK:BYB : made a new tmp array of size 262144            
06-19 21:34:25.157 29156 29172 D NDK:BYB : Set element 0
... 
06-19 21:34:25.157 29156 29172 D NDK:BYB : Set element 158
06-19 21:34:25.367 29204 29204 I DEBUG   : pid: 29156, tid: 29172  >>> com.backyardbrains <<<
06-19 21:34:25.367 29204 29204 I DEBUG   : signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 450ac000

この問題は、ループの値159で一貫して発生します。ただし、この関数に渡される配列の予想される長さは、固定の 131072 要素です (ログに反映されています)。配列のさらに下の値にアクセスできないのはなぜですか?ifor

4

1 に答える 1

1

たぶん、あなたの環境はスタックに割り当てられたそれほど多くのメモリをうまく処理していません。sizeof(tmp)==1メガバイトであるため。ヒープにtmpを割り当ててみてください。

于 2012-06-20T02:39:21.230 に答える