繁体   English   中英

线程“ main”中的JNI GetMethodID异常java.lang.NoSuchMethodError: <method>

[英]JNI GetMethodID Exception in thread “main” java.lang.NoSuchMethodError: <method>

我正在尝试使用posix_memalign从java.io.Reader读取C中分配的char缓冲区。

在我的java代码中

  public class LowerCaseTokenizer
{

 public native void Initialize(Reader input) throws IOException;
 public static String example = "XY&Z Corporation - xyz@example.com";

  public LowerCaseTokenizer(Reader input) throws IOException {

   Initialize(input);
  }

    public static void main(String[] args) throws IOException {

        System.loadLibrary("LowerCaseTokenizer");

        LowerCaseTokenizer sample = new LowerCaseTokenizer(new StringReader(example));}

}

对于C ++代码,我做了以下工作。

JNIEXPORT void JNICALL Java_LowerCaseTokenizer_Initialize(JNIEnv *env, jobject obj1, jobject obj2){

jclass input_class = env->GetObjectClass(obj2);
  jmethodID jread_method = env->GetMethodID(input_class, "read", "(C[II)I" );

  print_object_class_name(env, obj2);

}

问题是我得到了

Calling class is: java.io.StringReader // print_object_class_name(env, obj2); 
Exception in thread "main" java.lang.NoSuchMethodError: read

获得此方法的目的是我想从阅读器中读取以C ++分配的缓冲区(分配缓冲区时,我将每个字符问题考虑到UTF16(16位)问题)。

由于这个错误,我没有检查是否可以读取缓冲区实现。 但是,一些见解不会受到伤害。

do{
  numCharsRead  = env->CallIntMethod(obj2, jread_method ,source_ptr ,off , len);

  }while(numCharsRead != -1);

java.lang.NoSuchMethodError表示Java无法找到名称和签名与您所请求的内容匹配的方法。 您的要求是:

env->GetMethodID(input_class, "read", "(C[II)I" );

您可以使用javap获得正确的类型签名

> javap -s -classpath rt.jar java/io/StringReader
  ...
  public int read(char[], int, int) throws java.io.IOException;
    Signature: ([CII)I

但是您使用的是(C[II)I而不是([CII)I -您的[放错了位置。

读取功能的签名不是“(C [II] I]”。

我用c写的不是cpp。 但是我认为您只需要替换read方法的签名即可。

/*
* Class:     com_neohope_jni_test_LowerCaseTokenizer
* Method:    Initialize
* Signature: (Ljava/io/Reader;)V
*/
JNIEXPORT void JNICALL Java_com_neohope_jni_test_LowerCaseTokenizer_Initialize
(JNIEnv *env, jobject caller, jobject reader)
{
    getJniClassName(env, caller);
    getJniClassName(env, reader);

    jclass clazz = (*env)->GetObjectClass(env, reader);
    if (clazz == NULL)return;

    jmethodID midRead01 = (*env)->GetMethodID(env, clazz, "read", "()I");
    jmethodID midRead02 = (*env)->GetMethodID(env, clazz, "read", "([C)I");
    jmethodID midRead03 = (*env)->GetMethodID(env, clazz, "read", "([CII)I");

    //do your job here
    if (midRead01 == NULL)return;
    jint ret = (*env)->CallIntMethod(env, reader, midRead01);
    printf("%l", ret);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM