Java 返回奇怪值的NewDirectByteBuffer
我已经读了很多这样的问答,但我真的无法让它发挥作用。 我需要在一个JNI项目中使用C++中的一个向量(库需要它)。 所以我调用C++方法,它初始化向量并返回指向基础数组的指针。java应该填充它,然后调用另一C++方法来进行详细说明。 目前,要调试代码,doComputetion需要一个ByteBuffer,但以后不会 代码如下: .cpp: 如您所见,我使用值40.0初始化数组。在Java中,float f是除40.0之外的所有东西。我真的不明白出了什么问题:没有人会释放用new声明的向量。它应该留在那里。我注意到一个奇怪的事情:当分配C++时,如果我声明堆栈上的向量是静态的,它似乎起作用了。显然我不会做这样的坏事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声明的向量。它
同样的情况也不成立: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)