2016-07-26 76 views
1

我想從Java傳遞一個大字節[]到C++。我知道我可以使用Java字節緩衝區共享和Java C的內存++如下:從Java到C++傳遞一個字節數組到JNI沒有拷貝

ByteBuffer bb; 
    bb = ByteBuffer.allocateDirect(3); 
    byte[] byteArray = new byte[] { 0x01, 0x02, 0x03 }; 
    bb.put(byteArray); 
    modifyByteBuffer(bb); //native function 

並獲得在C++通過:

uint8_t *iBuf = (uint8_t*) env->GetDirectBufferAddress(buf1); 

然而,bb.put(byteArray)操作,是一個副本。如果我使用ByteBuffer.wrap(byteArray),那麼我無法通過env->GetDirectBufferAddress訪問C++端的字節數組。我如何解決這個難題,並通過byte[]而不需要做副本。

回答

3

你需要調用:

GetPrimitiveArrayCritical 

ReleasePrimitiveArrayCritical 

,用於向byte[]引用。不要打擾ByteBuffer

+1

我以爲JVM決定做一個副本或不與「GetPrimitiveArrayCritical」是不是這種情況? – Hossein

+1

JVM保留複製的權利,是的。我在實踐中從未觀察到這樣做。 – bmargulies