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

だから、私はバイトバッファを持っていて、Javaで適切なサイズを割り当て、ByteBuffer.put(index、byte)にできることに気づいたので、メソッドを取得しようとしましたが、Javaで行うと次の実行時例外を取得します。

java.lang.NoSuchMethodError:put

私が間違ったことをしたアイデアはありますか?私はJNIをそれほどよく知りません。そして、ほとんどの場合、Webで見つけた例を作り直しています。

4

1 に答える 1

7

メソッドのシグネチャ(I, B)Ljava/nio/ByteBufferが間違っています。,メソッド シグネチャとクラスの引数の間にはありませんL<class>;(忘れてしまいました;)。

したがって、正しい署名は次のとおりです。(IB)Ljava/nio/ByteBuffer;

その後、コードが機能するはずです。

于 2012-09-07T17:52:31.747 に答える