2012-07-04 2 views
13

ByteBuffer을 버퍼에서 읽고 쓰는 원시 함수에 전달해야합니다. 이러한 작업이 완료되면 정규 함수를 사용하여 Java 코드에서 ByteBuffer에 액세스하고 싶습니다. 특히 limit()position()은 버퍼의 현재 상태를 반영해야합니다.JNI에서 ByteBuffer 조작

JNI 직접, 내가 읽기/쓰기를 수행하고 이후 나는 flip()/limit()/position()를 호출해야합니다 가정입니다 기본 버퍼에 액세스 할 수 GetDirectBufferAddress()를 사용하기 때문에. 그러나, 나는이 일을 할 수 없었다. 예를 들어, C에서 버퍼로 몇 바이트를 읽고 그에 따라 제한 및 위치를 설정 한 후에 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); 
     } 
     ... 
    } 
} 

.

원래 구현 (아무것도 캐시 등) 자바 측 검사시

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; 
} 

제한을 버퍼에 설정된다.