1
JavaからC++に大きなバイト[]を渡したかったのです。私は次のように私はC++とJavaの間でメモリを共有するためのJavaたByteBufferを使用することができることを知っている:JavaからC++にバイト配列をコピーなしでJNIで渡す
C++経由でByteBuffer bb;
bb = ByteBuffer.allocateDirect(3);
byte[] byteArray = new byte[] { 0x01, 0x02, 0x03 };
bb.put(byteArray);
modifyByteBuffer(bb); //native function
とアクセスそれを:
uint8_t *iBuf = (uint8_t*) env->GetDirectBufferAddress(buf1);
しかし、bb.put(byteArray)
操作は、コピーです。 ByteBuffer.wrap(byteArray)
を使用すると、C++側のバイト配列にenv->GetDirectBufferAddress
でアクセスできません。どのようにしてこのジレンマを解決し、コピーする必要なくbyte[]
を渡すことができますか?
GetPrimitiveArrayCritical
と
ReleasePrimitiveArrayCritical
byte[]
への参照:
私は、JVMが "GetPrimitiveArrayCritical"を使ってコピーをするかどうかを決めると思っていましたか? – Hossein
JVMはコピーする権利を留保します。はい。私が実際にそうすることは決して見られませんでした。 – bmargulies