Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回奇怪值的NewDirectByteBuffer_Java_C++_Vector_Java Native Interface_Jnienv - Fatal编程技术网

Java 返回奇怪值的NewDirectByteBuffer

Java 返回奇怪值的NewDirectByteBuffer,java,c++,vector,java-native-interface,jnienv,Java,C++,Vector,Java Native Interface,Jnienv,我已经读了很多这样的问答,但我真的无法让它发挥作用。 我需要在一个JNI项目中使用C++中的一个向量(库需要它)。 所以我调用C++方法,它初始化向量并返回指向基础数组的指针。java应该填充它,然后调用另一C++方法来进行详细说明。 目前,要调试代码,doComputetion需要一个ByteBuffer,但以后不会 代码如下: .cpp: 如您所见,我使用值40.0初始化数组。在Java中,float f是除40.0之外的所有东西。我真的不明白出了什么问题:没有人会释放用new声明的向量。它

我已经读了很多这样的问答,但我真的无法让它发挥作用。 我需要在一个JNI项目中使用C++中的一个向量(库需要它)。 所以我调用C++方法,它初始化向量并返回指向基础数组的指针。java应该填充它,然后调用另一C++方法来进行详细说明。 目前,要调试代码,doComputetion需要一个ByteBuffer,但以后不会

代码如下:

.cpp:

如您所见,我使用值40.0初始化数组。在Java中,float f是除40.0之外的所有东西。我真的不明白出了什么问题:没有人会释放用new声明的向量。它应该留在那里。我注意到一个奇怪的事情:当分配C++时,如果我声明堆栈上的向量是静态的,它似乎起作用了。显然我不会做这样的坏事

同样的情况也不成立:C++中doCube中的浮点*F是所有的,但是10(它应该在java中初始化)。 显然,Java中的float g只不过是10。它模拟计算返回的数据

非常感谢您的任何提示。

谢谢@cubrr。 这是最后的结果。就打电话

 buf.order(ByteOrder.LITTLE_ENDIAN) 
在用Java读写值之前。
我猜到了,但我在周围什么也没发现,所以我猜它是根据操作系统自动设置的。它不是。

您能否分享一个将其设置为40.0时产生的字节示例?可能就是endianness-看看buf.order(ByteOrder.LITTLE_ENDIAN)(如果允许的话)是否有效。
public class nnJNI {
static {
    System.loadLibrary("YIAnnLib");
}

private native ByteBuffer allocateStorage(int size);

private native ByteBuffer doComputation(ByteBuffer buffer);

public void demo() {
    ByteBuffer buf = allocateStorage(2);
    float f = buf.getFloat();
    ByteBuffer b = ByteBuffer.allocateDirect(8);
    b.putFloat(10); b.putFloat(12);
    ByteBuffer res = doComputation(b);
    float g = res.getFloat();
}
}
 buf.order(ByteOrder.LITTLE_ENDIAN)