2012-09-07 2 views
2
JNIEXPORT jboolean JNICALL Java_directshowcamera_dsInterface_grab_1frame_1stream(JNIEnv *env, jobject obj, jint streamid, jobject barray) 
{ 
    jclass bbclass = env->FindClass("java/nio/ByteBuffer"); 
    jmethodID putMethod = env->GetMethodID(bbclass, "put", "(I, B)Ljava/nio/ByteBuffer"); 
    unsigned char *buffer = stream_buffer(streamid); 

    if(!stream_image_ready(streamid)) return (jboolean)0; 

    for(int i=0; i < stream_device_size(streamid); i++) { 
     env->CallByteMethod(barray, putMethod, i, (jbyte)buffer[i]); 
    } 

    return (jboolean)1; 
} 

그래서, 내가 바이트 버퍼를 가지고 있고, 자바에서 나는 적절한 크기를 할당 한 바이트를 넣어, 그것은 ByteBuffer.put (인덱스, 바이트)로하는 것이 가능하다 발견, 그래서를 얻기 위해 노력 방법을 사용하지만 Java에서 할 경우 다음 런타임 예외가 발생합니다.JNI의 ByteBuffer는

java.lang.NoSuchMethodError: put

내가 잘못 한 아이디어가 있습니까? 나는 JNI를 잘 모르고 있으며 웹에서 찾은 예제를 대부분 다시 작업 해왔다.

답변

6

메서드 서명 (I, B)Ljava/nio/ByteBuffer이 잘못되었습니다. 메서드 서명에 인수 사이에 ,이없고 클래스는 L<class>; (사용자는 ;을 잊어 버렸습니다)입니다.

그래서 올바른 서명은 다음과 같습니다

(IB)Ljava/nio/ByteBuffer; 그런 다음 코드는 작동합니다.

+0

당신, 선생님! – OzBarry

+0

@OzBarry 질문에 답변하는 것을 잊었거나 아직 답변을 선택하지 않은 이유는 무엇입니까? –

+0

죄송합니다. 나는 시도했지만, 2 분 정도 기다려야한다고 말했고, 나는 다른 어떤 일에 매료되었습니다. 걱정마, 너 돌아 왔어! – OzBarry