Android 调用JNI GetFieldID时出现挂起异常';java.lang.NoSuchFieldError';
我不明白为什么我总是犯这个错误 调用JNI GetFieldID时出现挂起异常“java.lang.NoSuchFieldError” 正在尝试调用Android 调用JNI GetFieldID时出现挂起异常';java.lang.NoSuchFieldError';,android,android-ndk,java-native-interface,Android,Android Ndk,Java Native Interface,我不明白为什么我总是犯这个错误 调用JNI GetFieldID时出现挂起异常“java.lang.NoSuchFieldError” 正在尝试调用GetFieldID()方法 这是我的main活动,带有mFd引用,从中调用本机方法: public class MainActivity extends Activity { ... private FileDescriptor mFd; } 下面的代码片段显示了创建文件描述符的过程: JNIEXPORT jobject JNI
GetFieldID()
方法
这是我的main活动
,带有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;
}
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调用进行错误检查。因此,由于之前的
jfieldID mFdID = (*env)->GetFieldID(env, MainActivityClass, "mFd", "Ljava/io/FileDescriptor;");
这是您连续两次调用GetFieldID()
的唯一位置,
您没有检查错误。您必须检查所有JNI API调用的错误。您可以通过反射来完成所有这些操作。不需要风险更高的JNI选项。您可以通过反射来完成所有这些。不需要风险更高的JNI选项。