gpt4 book ai didi

java - 从 native 代码访问 DoubleBuffer

转载 作者:行者123 更新时间:2023-12-01 15:21:00 25 4
gpt4 key购买 nike

我有一个直接的 ByteBuffer,它应该保存按以下方式创建的 15 个 double 值

DoubleBuffer buff = ByteBuffer.allocateDirect(15*8).asDoubleBuffer();

我想从 native 代码访问此缓冲区,为了简单起见,只需在其中写入 1.0 到 15.0 之间的数字即可。从java端来看,方法是

native public static void write(DoubleBuffer buff, int len);

然后我的 C++ 代码是

JNIEXPORT void JNICALL Java_ByteBufferTest_write(JNIEnv *env, jclass cl, jobject buff, jint len)
{
double* arr = (double*) env->GetDirectBufferAddress(buff);
for(int i=0; i<15; i++){
arr[i] = (double) i;
}
}

在java中调用以下内容

write(buff, 15);

for(int i=0; i<15; i++){
System.out.println(buff.get(i));
}

只打印垃圾。

问题是,我是否正确分配了 DoubleBuffer?这样写会比较好

DoubleBuffer s = ByteBuffer.allocateDirect(15 * Double.SIZE/8).asDoubleBuffer();

或者还有更好的方法吗?

第二个问题是,为什么这不起作用? JNI 代码中对 double* 的强制转换是否错误?

谢谢

最佳答案

默认情况下,Java 的 XxxxBuffer 是大端字节序。如果您使用的是 Intel/AMD 或某些 ARM 处理器之一,默认情况下它将是小端字节序。

尝试使用

DoubleBuffer buff = ByteBuffer.allocateDirect(15*8)
.order(ByteOrder.nativeOrder()).asDoubleBuffer();

顺便说一句:使用nativeOrder()通常也更快。 ;)

关于java - 从 native 代码访问 DoubleBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10929468/

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