Android NDK - 尝试使用try catch处理NoMemoryError异常

3

我有一段代码,它在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;
        }
    }

你的注释写着1MB,但实际上每次迭代会分配4MB。那段代码的问题在于,在你获得异常之前,Android会崩溃并烧毁。系统将尝试关闭其他应用程序和服务以释放内存,在此过程中,Android会变得非常缓慢,最终开始表现不当。与其这样压力系统,为什么不查询可用内存量呢? - BitBank
我只需要用于练习NDK...我认为没有办法在NDK中复制这个功能,你怎么看?顺便说一句,无论它是1MB还是4MB都不重要,我从运行时检查空闲内存。 - Waypoint
3个回答

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

Android对C++异常不太友好(您必须链接使用由Android提供的特殊版本的C++库才能使用异常)。也许您应该使用malloc()并检查其返回值以查看内存分配是否正常?


1
如果您在本地代码中触发异常/错误,您应该能够捕获 。然而,我认为使用malloc或类似方法分配大块未管理的内存不会触发错误,但会以硬编码方式终止您的应用程序。然而,如果您创建与Java代码中相同的大型Java数组,则调用创建数组的Java方法将失败并创建异常。由于JNI中的异常处理非常不同,因此您必须手动检查本机代码中的异常,例如使用以下内容:
exc = (*env)->ExceptionOccurred(env);
if (exc) ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接