gpt4 book ai didi

java - NewDirectByteBuffer 返回奇怪的值

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:53 25 4
gpt4 key购买 nike

我已经阅读了很多 SO Q/A,但我真的无法让它发挥作用。我需要在 JNI 项目中使用 C++ 中的 vector (库需要它)。所以我调用了一个 C++ 方法来初始化 vector 并返回指向底层数组的指针。 Java应该填充它,然后调用另一个C++方法来做细化。目前,为了调试代码,doComputetion 需要一个 ByteBuffer,但以后不会。

代码如下:

.cpp:

using namespace std;

JNIEXPORT jobject JNICALL Java_nnJNI_allocateStorage(JNIEnv * env, jobject obj, jint num)
{
vector<jfloat>* in = new vector<jfloat>(num, 40.0);
jobject jbuffer = env->NewDirectByteBuffer(in->data(), in->size() * sizeof(jfloat));
return env->NewGlobalRef(jbuffer); //I know this can be avoided
}

JNIEXPORT jobject JNICALL Java_nnJNI_doComputation(JNIEnv * env, jobject, jobject in)
{
float* f = (float*)env->GetDirectBufferAddress(in);
float* out = new float[1];
out[0] = 10;
jobject jbuffer = env->NewDirectByteBuffer(out, 1 * sizeof(jfloat));
return jbuffer;
}

Java类:

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();
}
}

如您所见,我用值 40.0 初始化了数组。在 Java 中,float f 不是 40.0。我真的不明白哪里出了问题:没有人会释放用 new 声明的 vector 。它应该留在那里。我注意到一件奇怪的事情:在 C++ 中分配时,如果我将堆栈上的 vector 声明为静态,它似乎可以工作。这种坏事我当然不会做。

相反的情况也不起作用:C++ 中的 doComputation 中的 float *f 除了 10(在 Java 中它应该具有的初始化值)之外的所有值。

显然,Java 中的 float g 不是 10。它模拟计算返回的数据。

非常感谢任何提示。

最佳答案

谢谢@cubrr。这是字节顺序。打电话

 buf.order(ByteOrder.LITTLE_ENDIAN) 

在 Java 中读写值之前。我猜对了,但是我周围什么都没有发现,所以我猜它是根据操作系统自动设置的。它不是。

关于java - NewDirectByteBuffer 返回奇怪的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com