![](/img/trans.png)
[英]“Exception in thread ”main“ java.lang.NoSuchMethodError ”
[英]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.