jni将jbytearay转换为std::string

bbuxkriu  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(392)

我用过https://stackoverflow.com/a/38769851 并适用于c++如下:

jsize num_bytes = env->GetArrayLength(message);
    char *buffer = new char(num_bytes + 1);

    if (!buffer) {
        // handle allocation failure ...
        //throw error?
        return 1;
    }

    // obtain the array elements
    jbyte* elements = env->GetByteArrayElements(message, NULL);

    if (!elements) {
        // handle JNI error ...
        //throw error?
        return 2;
    }

    // copy the array elements into the buffer, and append a terminator
    memcpy(buffer, elements, num_bytes);
    buffer[num_bytes] = 0;

    std::string m(buffer, num_bytes + 1);

    // Do not forget to release the element array provided by JNI:
    env->ReleaseByteArrayElements(message, elements, JNI_ABORT);

我得换衣服 char *buffer = malloc(num_bytes + 1);char *buffer = new char(num_bytes + 1); 因为c错误。顺便问一下,为什么它不能在c中工作?
好吧,用这个代码我就崩溃了。我想这可能和我所做的改变有关,因为 env->ReleaseByteArrayElements(message, elements, JNI_ABORT); 可能会释放它,就好像它是由 malloc .
c++中的这段代码应该如何工作?

nle07wnf

nle07wnf1#

new char(N) 分配单个 char 值为 N . 你想要一组 N 字符,所以使用 new char[N] 相反。
也就是说,你其实不需要 char[] 根本不需要数组。你可以构造 std::string 按原样使用java字节数组元素,例如:

jsize num_bytes = env->GetArrayLength(message);

// obtain the array elements
jbyte* elements = env->GetByteArrayElements(message, NULL);
if (!elements) {
    // handle JNI error ...
    //throw error?
    return 1;
}

// copy the array elements into the string
std::string m(reinterpret_cast<char*>(elements), num_bytes);

// Do not forget to release the element array provided by JNI
env->ReleaseByteArrayElements(message, elements, JNI_ABORT);

或者,至少,你可以预测 std::string 然后将字节数组元素复制到字符串自己的内存缓冲区中,例如:

jsize num_bytes = env->GetArrayLength(message);

// obtain the array elements
jbyte* elements = env->GetByteArrayElements(message, NULL);
if (!elements) {
    // handle JNI error ...
    // throw error?
    return 1;
}

// copy the array elements into the string
std::string m(num_bytes, ‘\0’);
std::copy_n(elements, num_bytes, m.begin());

// Do not forget to release the element array provided by JNI
env->ReleaseByteArrayElements(message, elements, JNI_ABORT);
5vf7fwbs

5vf7fwbs2#

专门铸造 mallocchar* :

char *buffer = (char *) malloc(num_bytes + 1);

c不需要这个,但c++需要。
链接的示例使用 C ,这就是造成这里细微差别的原因。
这个 C++ 编译器假定 malloc() 返回一个 int ,导致目标指针类型的类型大小不一致( char<-int )

kzmpq1sx

kzmpq1sx3#

注意你选择的括号(圆形和方形)。

char *buffer = new char(num_bytes + 1);

... 创建一个 char 它的值为 num_bytes + 1 .

char *buffer = new char[num_bytes + 1];

... 创建一个数组 num_bytes + 1 数量 char s。应该是这样。
相关:
为什么c++需要malloc()的强制转换,而c不需要?
在什么情况下我使用malloc和/或new?

相关问题