0

次の方法で作成された15個のdouble値を保持する必要がある直接ByteBufferがあります

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();

それとももっと良い方法がありますか?

2番目の質問は、なぜこれが機能しないのかということです。double*JNIコードのキャスト先が間違っていますか?

ありがとう

4

1 に答える 1

1

デフォルトでは、JavaのXxxxBufferはビッグエンディアンです。Intel / AMDまたは一部のARMプロセッサのいずれかを使用している場合、デフォルトではリトルエンディアンになります。

使ってみてください

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

ところで:nativeOrder()の使用も通常は高速です。;)

于 2012-06-07T09:54:28.240 に答える