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

Hos*_*ein 3 c++ java 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
Run Code Online (Sandbox Code Playgroud)

并通过以下方式在 C++ 中访问它:

uint8_t *iBuf = (uint8_t*) env->GetDirectBufferAddress(buf1);
Run Code Online (Sandbox Code Playgroud)

但是,bb.put(byteArray)操作,是一个副本。如果我使用ByteBuffer.wrap(byteArray),则无法使用env->GetDirectBufferAddress. 我如何解决这个困境并传递一个byte[]而无需复制。

bma*_*ies 5

您需要致电:

GetPrimitiveArrayCritical
Run Code Online (Sandbox Code Playgroud)

ReleasePrimitiveArrayCritical
Run Code Online (Sandbox Code Playgroud)

以供参考byte[]。根本不用理会ByteBuffer

  • JVM 保留复制的权利,是的。我从未在实践中观察到这样做。 (2认同)