我有一个直接的 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();
还是有更好的方法?
第二个问题是,为什么这不起作用?double*
JNI 代码中的转换是否错误?
谢谢