从本机代码访问DoubleBuffer

时间:2012-06-07 09:50:37

标签: java java-native-interface

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

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

我想从本机代码访问此缓冲区,为了简单起见,只需在其中写入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*是错误的吗?

由于

1 个答案:

答案 0 :(得分:1)

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

尝试使用

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

BTW:使用nativeOrder()通常也会更快。 ;)