Android 调用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

我不明白为什么我总是犯这个错误

调用JNI GetFieldID时出现挂起异常“java.lang.NoSuchFieldError”

正在尝试调用
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选项。