1

大きな画像ファイル (6000x6000) を読み取り、フィルタリング (ぼかしや色効果など) を適用して画像を保存する必要があるアプリケーションを開発しています。フィルタリング ライブラリは、Java でプログラムされたサード パーティ製のライブラリであり、次のようなものを入力として受け取ります。

/**
* rgbArray : is an Array of pixels 
*/
public int[] ImageFiltering(int[] rgbArray,int Width,int Height);

問題は、画像をメモリ (6000 x 6000 x 4 = 137.33 MB) にロードすると、Android が OutOfMemory エラーをスローすることです。いくつかのドキュメントを読み、NDK から割り当てられたメモリがアプリケーション ヒープの一部ではないことを知った後、興味深いアイデアを思いつきました。

  1. NDK から画像を開き、内容を読み取り、配列に保存します

  2. 配列を Java に戻す

  3. 配列データにフィルターを適用する

  4. 配列を NDK に返す

  5. データ配列を新しいイメージに保存し、配列メモリを解放します

big,fat 配列を返す NDK 関数の例を次に示します。

jint*
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,jobject thiz,jint w,jint h)
{

    int* pixels = (int*)malloc(w * h * 4);
    read_image_into_array("image.jpg",pixels);

    return pixels;
}

目標は、OutOfMemory エラーが発生しないようにネイティブでメモリを予約し、メモリ参照を Java に渡して操作できるようにすることです。私はC開発者ではなく、JNIに触れたことがないので、これはすべて理にかなっており、NDKでどのように実装できますか.

4

1 に答える 1

1

割り当てられたメモリをバッキング バッファーとして使用して、直接 ByteBuffer を使用します。JNI から ( を使用してNewDirectByteBuffer()) ダイレクト バイト バッファを割り当て、それを返すことができます。

メモリを破棄するための補完的な方法を提供するか、使用されなくなったことをネイティブ側に示す必要があります。

于 2012-11-03T13:47:58.713 に答える