2012-06-07 80 views
0

我有一个直接ByteBuffer应该容纳15个双重价值创造方式如下访问双缓冲从本地代码

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

默认情况下,Java的XxxxBuffer是big endian。如果您使用的是英特尔/ AMD或某些ARM处理器,则默认情况下它将是小端。

尝试使用

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

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