Java 从C中具有JNI的对象获取对象

Java 从C中具有JNI的对象获取对象,java,c,java-native-interface,native,Java,C,Java Native Interface,Native,下面是Java类的示例;在C语言中,我试图在“学生”中找到“人”,但失败了。但是,我可以从“学生”中获取int类型的“金额” 我试图将“people”作为字段名传递到方法中,但它仍然会给出以下错误:“java.lang.NoSuchFieldError:people”如文档所述,在GetFieldID方法中,不能单独使用“L”作为类型签名,必须在其后指定类名 例如,如果要指定参数为字符串,则必须使用Ljava/lang/String(最后的分号是签名的一部分!) 对于名为People的自定义类,

下面是Java类的示例;在C语言中,我试图在“学生”中找到“人”,但失败了。但是,我可以从“学生”中获取int类型的“金额”

我试图将“people”作为字段名传递到方法中,但它仍然会给出以下错误:“java.lang.NoSuchFieldError:people”

如文档所述,在
GetFieldID
方法中,不能单独使用“L”作为类型签名,必须在其后指定类名

例如,如果要指定参数为
字符串
,则必须使用
Ljava/lang/String(最后的分号是签名的一部分!)


对于名为
People
的自定义类,假设它位于包
中.package.name
,则必须使用
Lyour/package/name/People作为类型签名。

fid=(*env)->GetFieldID(env、cls、fieldName,“LCalculateResult/src/student/jni/student;”;仍然找不到,我应该把班里的“人”还是“学生”,但我试了两次也失败了。我只是意识到这两个项目是不同的路径,它如何定位它?你必须使用包名,而不是路径。查看你的
People.java
文件,它必须以
package your.package.name。将点转换为“/”,您将拥有有效的类型签名。如果
People
Student
的内部类,我认为您必须使用
$
将“外部”类与内部类分开:使用
Lyour/package/name/Student$People包test.jni.bean
code
这是我的包名,所以我转换成fid=(*env)->GetFieldID(env,cls,fieldName,“Ltest/jni/bean/Student$People;”
code
但仍然是java.lang.NoSuchFieldError:peopleanyways我修复了我的问题,
code
fid=(*env)->GetFieldID(env,cls,fieldName,“Ltest/jni/bean/People;”
code
只需给出类的包,忘记外部类“Student”我已经通过传递包名修复了类型签名。但是仍然无法修复我的问题
public class Student
{
   private People people;
   private Result result;
   private int amount;
}
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;
}