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;
        }
    }
4

3 回答 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
}
于 2012-04-16T12:56:32.020 回答
1

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

于 2012-04-08T01:56:11.320 回答
1

如果您在本机代码中触发异常/错误,您应该能够捕获 。但是,我会假设使用 malloc 或类似方法分配一大块非托管内存不会触发错误,但会以艰难的方式杀死你的应用程序。但是,如果您创建与您的 java 代码中相同的大型 java 数组,那么您调用来创建数组的 java 方法将失败并创建一个异常。由于 JNI 中的异常处理非常不同,因此您必须使用以下方式手动检查本机代码中的异常:

exc = (*env)->ExceptionOccurred(env);
if (exc) ...
于 2012-04-15T22:02:24.723 回答