使用JNI将字节数组从Java传递到C ++而不复制

时间:2016-07-26 20:40:52

标签: java c++ java-native-interface

我想将一个大字节[]从Java传递给C ++。我知道我可以使用Java ByteBuffers在C ++和Java之间共享内存,如下所示:

    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[]而无需复制。

1 个答案:

答案 0 :(得分:3)

您需要致电:

GetPrimitiveArrayCritical

ReleasePrimitiveArrayCritical

用于byte[]的引用。不要理会ByteBuffer