我想传递一个大阵的花车任何地方涨得超越浮动[100000]。 我有一个安装成功通过大小212的阵列,但任何较大和崩溃给予在logcat的下面的错误消息:
“致命信号11(SIGSEGV)在0xbe949000(代码= 1)”
我的代码
本机的功能
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的非常简洁明了简单地抓住了阵。 如果创建并传递一个float数组比212大,虽然我得到的错误,如上所示。
float tempArray[] = NativeWrapper.getArrayNative();
有没有人遇到这个问题,或者能看到我怎样才能解决这个限制? 此外,我很抱歉,如果这个问题已经被回答了,我找不到这个具体问题,也不是一个答案。 任何帮助将不胜感激 :)
编辑:
用于更新全局jfloatArray以避免垃圾收集器时频繁取通过JNI的阵列。
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;
}