2012-04-06 12 views
3

私はAndroidのNDKがメモリを大量に割り当てるコードブロックを持っています。私が必要とする最後のものは、try-catchブロックを使用することです.NoMemoryErrorが存在する可能性があります。ネイティブSDKに書き込む方法を知っていますか?Android NDK - NoMemoryErrorでキャッチしよう

私はこれと同じ機能を実装する必要があります。

 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; 
     } 
    } 
+0

あなたのコメントには1MBと書いてありますが、実際にはそれぞれ4MBの反復が割り当てられます。このコードの問題は、Androidがクラッシュして、例外が発生する前に焼くことです。システムはメモリを解放するために他のアプリやサービスをシャットダウンしようとします。その過程でAndroidは非常に遅くなり、最終的に不正行為を開始します。そのようなシステムにストレスを与えるのではなく、単に空きメモリの量を問い合わせるだけです。 – BitBank

+0

私はNDKを練習するためだけに必要です...そして、私はNDKでこの機能を再現する方法がないと思います、どう思いますか? btw、それは重要ではない、それは1 MBか4 MBかどうか、私は実行時から空きメモリをチェックする – Waypoint

答えて

4

あなたがフォロースニペットを使用して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

アンドロイドはnot very friendly to C++ exceptions(あなたは例外を持っているアンドロイドが提供するC++ライブラリの特別バージョンとリンクしなければならない)です。 malloc()を使用して戻り値をチェックして、メモリの割り当てが正常かどうかを確認する必要がありますか?

1

ネイティブコードで例外/エラーを発生させる場合は、catchitにする必要があります。しかし、mallocなどを使用して管理されていない大きなメモリを割り当てると、エラーは発生しませんが、難しい方法でアプリを強制終了すると仮定します。しかし、あなたのJavaコードと同じ大きなJava配列を代わりに作成すると、配列を作成するために呼び出すJavaメソッドが失敗し、例外が作成されます。 JNIで例外処理は非常に異なっているとして、あなたは手動のようなものを使用して、ネイティブコードで例外をチェックする必要があります:あなたのJNI機能で

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