我有一個Java程序,它被設計爲以自定義文件格式顯示圖像,使用JNI通過C++庫進行讀取。數據被加載到C++端的char數組中,並傳輸到Java端的BufferedImage。由於圖像的各部分可能會從內存中移除,需要定期重新加載,因此我希望這些操作儘可能快。有效地將大量字節數據從C++傳輸到Java
我現在正在這樣做的方式是將數據從文件讀取到C++庫的內存中的緩衝區中。爲了填充BufferedImage,Java代碼爲每個像素從這個緩衝區讀取一個JNI函數調用,並在必要時將另一個數據塊加載到緩衝區中。這有效,但比我想要的更高的開銷。
我一直在打算做的改進之處是使用JNI調用將BufferedImage對象傳遞給C++代碼,並從該方面對其進行函數調用。我一直在儘可能多地研究JNI,但是我一直無法確定是否需要從由JVM加載的C++庫中修改Java對象。這是一個實現這一點的好方法,還是有更快的方法來用JNI傳輸大量的字節數據?
每個像素的呼叫聽起來很糟糕!這將是數十億的更大圖像的呼叫。那麼一次獲取塊或光柵線(例如更大的圖像單元)怎麼辦?光柵線可以按包裝順序讀取,並避免額外的轉換? – user2246674
是的,行和塊都可以讀入C++端的緩衝區。我在C++方面做了一些優化。問題是我不知道一種有效的方法將數據傳回給java,所以我對每個像素單獨調用以從C++緩衝區讀取數據。 – resueman
@resuerman可以做些什麼[WritableRaster.setSamples](http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/image/WritableRaster.html#setSamples(int,%20int,%20int ,%20int,%20int,%20double []))會被使用嗎?如果可以的話,那麼它可能只是找到一種方法(最高效地)將數據加載到Java數組中。有沒有一種方法來固定數組和/或包裝[C++]內存並避免[主]副本?即使有額外的拷貝操作(C++ - > Java Array-> Raster),它仍然會大大減少JNI調用的數量。另外(我敢說這聽起來「更聰明」),OpenGL(紋理)可以用在這裏嗎? – user2246674