float [100000]を超えて、floatの単一の大きな配列をどこにでも渡したいと思っています。サイズ212の配列を正常に渡すセットアップがあります。しかし、それより大きくするとクラッシュし、logcatに次のエラーメッセージが表示されます。
「0xbe949000(コード= 1)での致命的な信号11(SIGSEGV)」
私のコード
ネイティブ機能
NIEXPORT jfloatArray JNICALL Java_carron_graphics_benchmark_NativeWrapper_getArrayNative(JNIEnv * env, jclass cls) {
int tempSize = mParticleSystem->mSizeOfSystem*2;
jfloat cArray[tempSize];
jsize len = sizeof(cArray);
jfloatArray jArray = (*env).NewFloatArray(len);
if (jArray != NULL) {
jint i;
for (i = 0; i < tempSize; i++) {
cArray[i] = mParticleSystem->mParticlePositions[i];
}
(*env).SetFloatArrayRegion(jArray, 0, len, cArray);
}
return jArray;
}
Java かなり簡単に、配列を取得するだけです。上記のようなエラーが発生しますが、212より大きいfloat配列を作成して渡すと、
float tempArray[] = NativeWrapper.getArrayNative();
誰かがこの問題に遭遇したことがありますか、または私がこの制限を回避する方法を見ることができますか?また、この質問がすでに回答されている場合はお詫び申し上げます。この特定の問題も回答も見つかりませんでした。どんな助けでもありがたいです:)
編集:
jniを介して配列を頻繁にフェッチするときにガベージコレクターを回避するために、グローバルjfloatArrayを更新します。
static jfloatArray gArray = NULL;
JNIEXPORT jfloatArray JNICALL Java_carron_graphics_benchmark_NativeWrapper_getArrayNative(JNIEnv * env, jclass cls) {
int arrayLength = mParticleSystem->mSizeOfSystem*2;
if (gArray == NULL)
{
// create array
jfloatArray jArray;
jArray = env->NewFloatArray(arrayLength);
gArray = (jfloatArray)env->NewGlobalRef(jArray);
}
// Update global
env->SetFloatArrayRegion(gArray, 0, arrayLength, mParticleSystem->mParticlePositions);
return gArray;
}