中的 JNI GetMethodID 异常-6ren"> 中的 JNI GetMethodID 异常-我正在尝试使用 posix_memalign 从 java.io.Reader 读取在 C 中分配的字符缓冲区。 在我的java代码中 public class LowerCaseTokenize-6ren">
gpt4 book ai didi

java - 线程 "main"java.lang.NoSuchMethodError : 中的 JNI GetMethodID 异常

转载 作者:行者123 更新时间:2023-12-02 03:23:13 36 4
gpt4 key购买 nike

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

在我的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 --- 您的 [ 放错了地方。

关于java - 线程 "main"java.lang.NoSuchMethodError : <method> 中的 JNI GetMethodID 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39340003/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com