java - JNI ByteBuffer 放字节

标签 java c++ java-native-interface bytebuffer nosuchmethoderror

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 不是很了解,并且大部分时间都在重新处理我从网上找到的示例。

最佳答案

方法签名(I, B)Ljava/nio/ByteBuffer是错的。没有 ,方法签名和类中的参数之间是 L<class>; (你忘记了 ; )。

所以正确的签名是:(IB)Ljava/nio/ByteBuffer;

那么代码应该可以工作了。

关于java - JNI ByteBuffer 放字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12322964/

相关文章:

java - 程序执行完毕后如何使用ArrayList和整数字段中的数据?

c++ - 部分模板特化问题

c++ - 无法使用 JNI 从 C++ 调用 Java

java - iOS 上的 UnsatisfiedLinkError 而不是 Android,loadLibrary 总是成功

java - 扫描仪在空格字符后不读取

java - 在 Java 中计算这个数学表达式时,我在哪里搞砸了?

java - 如何通过 Jackson 传递原始 JSON?

c++ - 尽管 QSqlQuery::exec 失败,但未提供错误描述

c++ - VS2015 预览 : NDK_ROOT is not defined

java - 如何在 hadoop 源代码中调试 native 函数?