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 に答える