我正在開發一個應用程序,我需要讀取大圖像文件(6000x6000),然後應用一些過濾(如模糊和顏色效果),然後保存圖像。 過濾庫是用Java編程,並採取像這樣作爲輸入第三方庫:從jni(ndk)創建大數組並將它們返回給android
/**
* rgbArray : is an Array of pixels
*/
public int[] ImageFiltering(int[] rgbArray,int Width,int Height);
的問題是,如果我在存儲器加載圖像(6000 x 6000像素×4 = 137.33 MB )android會拋出OutOfMemory錯誤。 閱讀一些documentation並且知道從NDK分配的內存不是應用程序堆棧的一部分後,我得到一個有趣的想法:
打開從NDK圖像閱讀其內容,並將其保存在一個數組
數組傳遞迴Java
應用過濾器的陣列數據
返回數組NDK
數據陣列保存到一個新的圖像,並釋放所述陣列存儲器
這裏是與大,脂肪陣列返回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中實現。
謝謝,我會檢查ByteBuffer,做一個測試並告訴你結果。 – Nikoi
比較http://developer.android.com/guide/practices/jni.html#faq_sharing – fadden