2014-09-24 29 views
1

在Java中,我讓用戶選擇一個圖像文件。然後我解碼它,轉換成PNG,然後傳遞給JNI。 我懷疑我不需要經常複製和分配太多內存。我怎樣才能削減這個?有沒有一種方法可以檢測圖像類型是JPEG還是PNG,而不是解碼&重新編碼位圖並傳遞原始的JPEG/PNG數據?或者用更少的分配來完成轉換?現在它正在吃掉很多的記憶。使用更少的內存將位圖傳遞給JNI

的Java:

Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath); 
ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
yourSelectedImage.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
byte[] byteData = outStream.toByteArray(); 

JNILib.PickedImage(byteData); 

在C,我有以下的PickedImage代碼:

jbyte *b = (jbyte*)env->GetByteArrayElements(data, NULL); 
jsize dataSize = env->GetArrayLength(data); 
byte* imageData = (byte*)malloc(dataSize); 
memcpy(imageData, b, dataSize); 
env->ReleaseByteArrayElements(data, b, 0); 

imageSelectCallback(imageData, dataSize); 
+0

看看[這個問題](http://stackoverflow.com/questions/9643228/ test-if-file-is-an-image) - 它可能會給你一些線索 – 2014-09-24 20:03:11

回答

0

使用java.nio.ByteBuffer並調用allocateDirect功能通過Java和C.分配訪問存儲器中。然後在C中,通過執行env->GetDirectBufferAddress以及通過執行env->GetDirectBufferCapacity來獲得指向緩衝區的指針。

這樣,你只有一個緩衝區共享同一枚硬幣的兩面。 Java和C都將在相同的映像上運行。

再次,將文件讀入java.nio.ByteBuffer並將其傳遞給C.如果C需要COPY的圖像,那麼您將別無選擇,只能分配2個緩衝區(就像您現在所做的那樣)。懷疑你不需要一個副本,並且可以修改Java提供給你的緩衝區。

+0

如果C代碼free()它呢? Java如何反應? – user1054922 2014-09-24 21:48:29

+0

如果您在C中分配了C,則可以釋放它,否則將所有對它的引用設置爲JNI/Java代碼中的NULL。 – Brandon 2014-09-24 23:32:46

相關問題