Java 从本机代码访问双缓冲区

Java 从本机代码访问双缓冲区,java,java-native-interface,Java,Java Native Interface,我有一个直接的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 J

我有一个直接的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;
    }
}
还是有更好的方法

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


谢谢

默认情况下,Java的XxxxBuffer是big-endian。如果您使用的是Intel/AMD或某些ARM处理器,默认情况下它将是little endian

试用

DoubleBuffer buff = ByteBuffer.allocateDirect(15*8)
                              .order(ByteOrder.nativeOrder()).asDoubleBuffer();
顺便说一句:使用nativeOrder()通常也会更快

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