在我的jni代码中我有
std::vector<uint32_t> vecIndices = sm->getIndices();
for(int i=0;i<4;i++) {
printf("%i, ",vecIndices[i]);
}
printf("\n");
uint32_t* p = &vecIndices[0];
for(int i=0;i<4;i++) {
printf("%i, ",p[i]);
}
printf("\n\n");
fflush(stdout);
jobject buff = env->NewDirectByteBuffer((void*)&p[0],sm->getNoOfIndices()*sizeof(uint32_t));
return buff;
当我在java中使用它时:
ByteBuffer ind = PVcore.meshGetIndices(mesh);
IntBuffer indI= ind.asIntBuffer();
for (int i=0;i<4;i++) {
System.out.print(indI.get(i)+", ");
}
System.out.println();
for (int i=0;i<16;i++) {
if (i % 4==0) System.out.println();
System.out.print(ind.get(i)+", ");
}
System.out.println();
我看到了这个输出:
[java] 0, 2, 1, 1,
[java] 0, 2, 1, 1,
[java]
[java] 0, 0, -797764393, 117440512,
[java]
[java] 0, 0, 0, 0,
[java] 0, 0, 0, 0,
[java] -48, 115, 20, -41,
[java] 7, 0, 0, 0,
从第二行(0,2,1,1)我似乎在内存块中有一组连续的值,如std :: vector所期望的那样,但是这个地址给了NewDirectByteBuffer,甚至查看了字节值我似乎得到了奇怪的价值......
答案 0 :(得分:2)
std::vector<uint32_t> vecIndices
将从函数末尾的作用域中删除。
因此,p
处的内存不再可用。
鉴于NewDirectByteBuffer
没有获取数组的深层副本,buff
将引用您不再拥有的内存。