我不知道为什么我总是收到此错误
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调用进行错误检查。