我无法弄清楚为什么我总是会收到此错误
使用挂起异常'java.lang.NoSuchFieldError'调用JNI GetFieldID
尝试调用GetFieldID()
方法。
以下是我的MainActivity
mFd
引用,并从中调用本机方法:
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);
}
答案 0 :(得分:2)
因此,之前的
没有这样的字段jfieldID mFdID = (*env)->GetFieldID(env, MainActivityClass, "mFd", "Ljava/io/FileDescriptor;");
这是你连续两次拨打GetFieldID()
的唯一地方,
而你没有检查错误。您必须对所有 JNI API调用进行错误检查。