2012-11-03 34 views
1

我正在開發一個應用程序,我需要讀取大圖像文件(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分配的內存不是應用程序堆棧的一部分後,我得到一個有趣的想法:

  1. 打開從NDK圖像閱讀其內容,並將其保存在一個數組

  2. 數組傳遞迴Java

  3. 應用過濾器的陣列數據

  4. 返回數組NDK

  5. 數據陣列保存到一個新的圖像,並釋放所述陣列存儲器

這裏是與大,脂肪陣列返回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中實現。

回答

1

使用直接的ByteBuffer,使用分配的內存作爲其後臺緩衝區。你可以從JNI中分配一個直接的字節緩衝區(使用NewDirectByteBuffer())並返回它。

您需要提供一種補充方法來處置內存或以其他方式向本地方表明它不再使用。

+0

謝謝,我會檢查ByteBuffer,做一個測試並告訴你結果。 – Nikoi

+1

比較http://developer.android.com/guide/practices/jni.html#faq_sharing – fadden

相關問題