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[]
而不需要做副本。
我以爲JVM決定做一個副本或不與「GetPrimitiveArrayCritical」是不是這種情況? – Hossein
JVM保留複製的權利,是的。我在實踐中從未觀察到這樣做。 – bmargulies