我用过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++中的这段代码应该如何工作?
3条答案
按热度按时间nle07wnf1#
new char(N)
分配单个char
值为N
. 你想要一组N
字符,所以使用new char[N]
相反。也就是说,你其实不需要
char[]
根本不需要数组。你可以构造std::string
按原样使用java字节数组元素,例如:或者,至少,你可以预测
std::string
然后将字节数组元素复制到字符串自己的内存缓冲区中,例如:5vf7fwbs2#
专门铸造
malloc
至char*
:c不需要这个,但c++需要。
链接的示例使用
C
,这就是造成这里细微差别的原因。这个
C++
编译器假定malloc()
返回一个int
,导致目标指针类型的类型大小不一致(char<-int
)kzmpq1sx3#
注意你选择的括号(圆形和方形)。
... 创建一个
char
它的值为num_bytes + 1
.... 创建一个数组
num_bytes + 1
数量char
s。应该是这样。相关:
为什么c++需要malloc()的强制转换,而c不需要?
在什么情况下我使用malloc和/或new?