JNI GetFieldID 被调用,但挂起异常'java.lang.NoSuchFieldError'



我不知道为什么我总是收到此错误

JNI GetFieldID 被调用,但未处理异常"java.lang.NoSuchFieldError" .

尝试调用GetFieldID()方法。

这是我mFd引用的MainActivity,从中调用本机方法:

public class MainActivity extends Activity {
...
private FileDescriptor mFd;
}

下面的代码片段显示了创建文件描述符的过程:

JNIEXPORT jobject JNICALL Java_ua_taras_appc_MainActivity_configure (...)
{
/* Create a corresponding file descriptor */
{
jclass cFileDescriptor = (*env)->FindClass(env, "java/io/FileDescriptor");
jmethodID iFileDescriptor = (*env)->GetMethodID(env, cFileDescriptor, "<init>", "()V");
jfieldID descriptorID = (*env)->GetFieldID(env, cFileDescriptor, "descriptor", "I");
mFileDescriptor = (*env)->NewObject(env, cFileDescriptor, iFileDescriptor);
(*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint)fd);
}
return mFileDescriptor;
}

在这里,我获取文件描述符的值int

JNIEXPORT void JNICALL Java_ua_taras_appc_MainActivity_readuart (...)
{
jclass MainActivityClass = (*env)->GetObjectClass(env, thiz);
jclass FileDescriptorClass = (*env)->FindClass(env, "java/io/FileDescriptor");
jfieldID mFdID = (*env)->GetFieldID(env, MainActivityClass, "mFd", "Ljava/io/FileDescriptor;");
jfieldID descriptorID = (*env)->GetFieldID(env, FileDescriptorClass, "descriptor", "I");
jobject mFd = (*env)->GetObjectField(env, thiz, mFdID);
jint descriptor = (*env)->GetIntField(env, mFd, descriptorID);
}

所以没有这样的字段作为先前的结果

jfieldID mFdID = (*env)->GetFieldID(env, MainActivityClass, "mFd", "Ljava/io/FileDescriptor;");

这是你连续两次打电话给GetFieldID()的唯一一个地方, 并且您未能检查错误。您必须对所有 JNI API调用进行错误检查。

相关内容

最新更新