将java中的byte []转换为C++中的unsigned char*的正确方法,反之亦然?

Hie*_*yen 28 c++ java-native-interface android

我是C++和JNI的新手,我试图通过使用JNI找到一种正确的方法将java中的byte []转换为C++中的unsigned char*,反之亦然!(我正在研究android)在google和SO中寻找解决方案之后,我还没有找到一个很好的细节方法将java中的byte []转换为C++.请帮助我,并提供相反的解决方案(C++中的unsigned char*到java中的byte []).非常感谢

  • java中的byte []到C++中的unsigned char*:

JAVA:

private static native void nativeReceiveDataFromServer(byte[] value, int length);
Run Code Online (Sandbox Code Playgroud)

JNI:

... (JNIEnv* env, jobject thiz, jbyteArray array, jint array_length)
{
    ???
}
Run Code Online (Sandbox Code Playgroud)

PS:我修改了我的问题,因为我的问题是一个真正的问题:(

Zha*_*arf 66

您可以使用它将unsigned char数组转换为jbyteArray

jbyteArray as_byte_array(unsigned char* buf, int len) {
    jbyteArray array = env->NewByteArray (len);
    env->SetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf));
    return array;
}
Run Code Online (Sandbox Code Playgroud)

转换相反的方式......

unsigned char* as_unsigned_char_array(jbyteArray array) {
    int len = env->GetArrayLength (array);
    unsigned char* buf = new unsigned char[len];
    env->GetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf));
    return buf;
}
Run Code Online (Sandbox Code Playgroud)

  • 这将工作几乎相同.不同之处在于,在您的代码中,您为本机代码提供了一个缓冲区来放入数据,在我的版本中,本机代码会创建缓冲区.哪个更好取决于用例. (2认同)