使用C中的JNI从对象获取对象

use*_*874 4 c java java-native-interface native

public class Student
{
   private People people;
   private Result result;
   private int amount;
}
Run Code Online (Sandbox Code Playgroud)

这是Java中类的示例; 在C中,我试图让"学生"中的"人",但我失败了.但是,我可以从"学生"获得int类型"金额".

jobject getObjectFromObject(JNIEnv *env, jobject obj, const char * fieldName)
{
    jfieldID fid; /* store the field ID */
    jobject i;

    /* Get a reference to obj's class */
    jclass cls = (*env)->GetObjectClass(env, obj);

    /* Look for the instance field s in cls */
    fid = (*env)->GetFieldID(env, cls, fieldName, "L");
    if (fid == NULL)
    {
        return 0; /* failed to find the field */
    }

    /* Read the instance field s */
    i = (*env)->GetObjectField(env, obj, fid);

    return i;
}
Run Code Online (Sandbox Code Playgroud)

我试图将"people"作为fieldName传递给方法,但它仍然会出现以下错误:"java.lang.NoSuchFieldError:people"

mbr*_*non 8

如此处所述,在该GetFieldID方法中,您不能单独使用"L"作为类型签名,您必须在此之后指定类名.

例如,如果要指定参数是a String,则必须使用Ljava/lang/String;(最终分号是签名的一部分!).

对于您命名的自定义类People,假设它在包中your.package.name,您将必须Lyour/package/name/People;用作类型签名.