次のコードでセグメンテーション違反が発生しています。
#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 要素です (ログに反映されています)。配列のさらに下の値にアクセスできないのはなぜですか?i
for