java - jni 使用 NewDirectByteBuffer 在 java 中看到随机的东西

标签 java java-native-interface bytebuffer

在我的 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 ,甚至查看字节值我似乎得到了奇怪的值...

最佳答案

std::vector<uint32_t> vecIndices在函数末尾从作用域中删除。

所以内存在 p您不再可用。

鉴于NewDirectByteBuffer不获取数组的深拷贝,buff将引用您不再拥有的内存。

关于java - jni 使用 NewDirectByteBuffer 在 java 中看到随机的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27549068/

相关文章:

android - OpenCV nMatToBitmap 断言失败

ios - 将 uint8_t 转换为 NSData

java - 过滤功能不偷懒

java - 在java中仅使用灰度值数组绘制图像

android - 从 java 传递给 jni 的参数返回奇怪的值

android - 为什么使用 Android NDK 通过 JNI 将 native 数组复制回 Java 无法正确填充?

java - 将Java位图转换为字节数组

java - 如何构造一个包含多种数据类型值的字节数组?

java - 像oracle中的搜索一样吗?

java.net.socket 实现