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

时间:2017-08-16 04:33:29

标签: android android-ndk java-native-interface

我无法弄清楚为什么我总是会收到此错误

  

使用挂起异常'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);
}

1 个答案:

答案 0 :(得分:2)

因此,之前的

没有这样的字段
jfieldID mFdID = (*env)->GetFieldID(env, MainActivityClass, "mFd", "Ljava/io/FileDescriptor;");

这是你连续两次拨打GetFieldID()的唯一地方, 而你没有检查错误。您必须对所有 JNI API调用进行错误检查。