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

Passing a byte array from Java to C++ with JNI without copy

本文关键字:C++ 复制 Java JNI 字节 字节数 数组 使用      更新时间:2023-10-16

我想把一个大字节[]从Java传递给C++。我知道我可以使用JavaByteBuffers在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[]

您需要调用:

GetPrimitiveArrayCritical

ReleasePrimitiveArrayCritical

用于参考CCD_ 5。根本不用为ByteBuffer而烦恼。