大きな画像ファイル (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 から割り当てられたメモリがアプリケーション ヒープの一部ではないことを知った後、興味深いアイデアを思いつきました。
NDK から画像を開き、内容を読み取り、配列に保存します
配列を Java に戻す
配列データにフィルターを適用する
配列を NDK に返す
データ配列を新しいイメージに保存し、配列メモリを解放します
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でどのように実装できますか.