2012-07-04 10 views
13

ByteBufferをバッファから読み書きするネイティブ関数に渡す必要があります。これらの操作が完了したら、通常の機能を使用してJavaコードからByteBufferにアクセスしたいと思います。特に、limit()position()は、バッファの現在の状態を反映する必要があります。JNIからByteBufferを操作する

JNIは直接根底にあるバッファにアクセスするためにGetDirectBufferAddress()を使用しますので、私は私が書き込み/読み出し行っていた後、私はflip()/limit()/position()を呼び出す必要がありますと仮定しています。しかし、私はこの仕事をすることができませんでした。例えば、私はCからバッファに数バイトを読み込んだ後、その限界と位置を設定した後、Javaからそれらのバイトを照会することはできません。バッファの制限と位置に関するJavaの考えは、私がCコードで行ったこととは一致しません。

誰でも私にこの実例を指摘できますか?前もって感謝します。

+0

これはすべてのアイデアです。あなたが設定しているポジションとリミットの値はどのようなものですか、それらの値はJavaで見ていますか? – EJP

答えて

13

ネイティブメソッドに書き込まれたバイト数を返させることができます。それに応じてJava側でByteBufferを更新します。あなたはそれで問題が発生した理由を私は知らない、あまりにも働いているC側の限界値を設定するために試す編集

public class SomeClass { 
    /** 
    * @param buffer input/output buffer 
    * @return number of bytes written to buffer 
    */ 
    private native int nativeMethod(ByteBuffer buffer); 

    public void myMethod() { 
     ByteBuffer buffer = ByteBuffer.allocateDirect(100); 
     int written = nativeMethod(buffer); 
     if (written > 0) { 
      buffer.limit(written); 
     } 
     ... 
    } 
} 

ナイーブ実装(何もキャッシュ等):Java側で検査するとき

static jint nativeMethod(JNIEnv *env, jobject obj, jobject buffer) { 
    jclass cls = env->GetObjectClass(buffer); 
    jmethodID mid = env->GetMethodID(cls, "limit", "(I)Ljava/nio/Buffer;"); 
    char *buf = (char*)env->GetDirectBufferAddress(buffer); 
    jlong capacity = env->GetDirectBufferCapacity(buffer); 
    int written = 0; 

    // Do something spectacular with the buffer... 

    env->CallObjectMethod(buffer, mid, written); 
    return written; 
} 

制限がバッファに設定されています。

関連する問題