Android NDK - 尝试捕获NoMemoryError

时间:2012-04-06 12:54:07

标签: android exception exception-handling android-ndk

我有代码块,在Android NDK中分配了大量的内存。最后我需要的是使用try-catch块的可能性,可能有NoMemoryError。你知道怎么用原生SDK写吗?

我需要实现与此相同的功能:

        for(int i=1;i<50;i++){
        try{
            int[] mega =new int[i*1024*1024];//1MB

        }catch (OutOfMemoryError e) {
            usedMemory= (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/new Float(1048576.0);
            usedText=usedMemory+" MB";
            tw.setText(usedText);          
            break;
        }
    }

3 个答案:

答案 0 :(得分:4)

在您的JNI函数中,您可以使用以下代码段抛出java异常。编译本机代码时,请确保启用RTTI和异常。

try {
  int *mega = new int[1024 * 1024];
} catch (std:: bad_alloc &e) {
  jclass clazz = jenv->FindClass("java/lang/OutOfMemoryError");
  jenv->ThrowNew(clazz, e.what());
}

在Java中,您只需捕获OutOfMemoryError。

try {
  // Make JNI call
} catch (OutOfMemoryError e) {
  //handle error
}

答案 1 :(得分:1)

Android是not very friendly to C++ exceptions(您必须链接Android提供的特殊版本的C ++库才能有例外)。也许您应该使用malloc()并检查其返回值以查看内存分配是否正常?

答案 2 :(得分:1)

如果您在原生代码中触发了异常/错误,则应该能够catch it。但是,我认为使用malloc或类似方法分配大量非托管内存不会触发错误,但会以很难的方式杀死你。但是,如果创建与java代码相同的大型java数组,则调用以创建数组的java方法将失败并创建异常。由于JNI中的异常处理非常不同,您必须使用以下内容手动检查本机代码中的异常:

exc = (*env)->ExceptionOccurred(env);
if (exc) ...