JNI函数在声明大型数组时崩溃



目前我在Android Studio项目中编写了一个JNI函数,应用程序在JNI函数的这一行崩溃了。

rgbStruct values[1700][1700];

而rgb指令是

struct rgbStruct {
unsigned char r, g, b;
}

错误消息为A/libc: Fatal signal 11 (SIGSEGV), code 2, fault addr 0xbf06f37c in tid 11351

有趣的是,rgbStruct values[1500][1500];运行良好。所以我想这将是一个内存泄漏问题,我不确定如何增加本机端的内存限制。我已经尝试过从studio.vmpoptions文件中增加内存大小,但这根本没有帮助。请让我知道我能为此做些什么。

studio.vmoptions

-Xmx8000m
-XX:MaxPermSize=4024m
-XX:ReservedCodeCacheSize=2000m
-XX:+UseCompressedOops

代码参考:

extern "C" JNIEXPORT jstring JNICALL Java_com_test_MainActivity_funcFromJNI(
JNIEnv * env, jobject  obj) {
rgbStruct pixels[1700][1700];
return env->NewStringUTF("Hello");
}

是的,你不能那样做。您所做的是在C函数中声明一个大小约为7MB的局部变量。运行时将尝试在堆栈上分配,而不是在堆上。这行不通。

您需要在堆上使用malloc或类似的东西动态地为其分配内存。阅读如何在使用JNI时动态分配内存。

最新更新