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

JNI function crash when declare large arrays

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

rgbStruct values[1700][1700];

而 rgbStruct 是

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 时动态分配内存的信息。