声明大型数组时 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 时动态分配内存的信息。
目前我在 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 时动态分配内存的信息。