2016-08-22 42 views
1

我正在使用JavaCPP來利用Java應用程序中的一些C++庫,但操縱數據是大數據。所以,我的代碼工作正常,但不是記憶友好(我需要它的工作速度快):如何處理避免數據複製的JavaCPP?

  • 我有一個大byte[][]提供原生的一部分。
  • 目標本地功能是一樣的東西nativeFunction(PointerPointer param) - >Doc
  • (準確地,這是一個PointerPointer<BytePointer>型預期,從而byte[][]BytePointer一個列表是byte[]列表) - >Doc

我初始化預期PARAM這樣:

byte[][] myBigDatas; 
// myBigDatas.length = 4 
// myBigDatas[x].length = something like 4000000 

// Initialize param 
PointerPointer<BytePointer> srcParam = new PointerPointer<BytePointer>(
    myBigDatas[0], 
    myBigDatas[1], 
    myBigDatas[2], 
    myBigDatas[3]); 

// Call the native function 
nativeFunction(srcParam); 

問題是,參考各種文檔,每個BytePointerPointerPointer<BytePointer>(...)與提供的數據的調用創建,它不是一個內存包裝,而是一個副本。

有一種方法可以避免複製?

編輯:

否則,不爲JNI提供給予解決,並返回byte[][]但沒有照搬? (我知道這是一個簡單的byte[]

+0

如果內存和執行時間很關鍵,本機無法避免,我會將更多的代碼轉移到本機端...... – Fildor

+0

@Fildor是對的。我建議用C++而不是java讀取byte []。 – neohope

+0

@雙方當然你是對的,但不幸的是,我現在不能。 – N0un

回答

0

我找到了一個解決方案,只是想分享它。我將byte[][]替換爲ByteBuffer[]直接ByteBuffer)。然後,做

BytePointer bp = new BytePointer(/*direct ByteBuffer*/) 

不能複製!性能增益巨大!