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: положить
Есть идеи, что я сделал не так? Я не очень хорошо знаю JNI, и в основном я перерабатывал примеры, которые я нашел в Интернете.
Подпись метода (I, B)Ljava/nio/ByteBuffer
неправильно. Здесь нет ,
между аргументами в сигнатурах методов и классах L<class>;
(ты забыл ;
).
Итак, правильная подпись: (IB)Ljava/nio/ByteBuffer;
Тогда код должен работать.
Других решений пока нет …