2016-07-26 25 views
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[]への参照:

答えて

3

あなたが呼び出す必要があります。 ByteBufferをまったく気にしないでください。

+1

私は、JVMが "GetPrimitiveArrayCritical"を使ってコピーをするかどうかを決めると思っていましたか? – Hossein

+1

JVMはコピーする権利を留保します。はい。私が実際にそうすることは決して見られませんでした。 – bmargulies

関連する問題