我想在浮点数[100000]之外的任何地方传递一个大的浮点数数组。我有一个设置成功地传递了一个大小为 212 的数组。但是任何更大的它都会崩溃,并在 logcat 中给出以下错误消息:
“致命信号 11 (SIGSEGV) 位于 0xbe949000 (code=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 非常简单,只需抓取数组即可。如果我创建并传递一个大于 212 的浮点数组,尽管我得到了如上所示的错误。
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;
}