Java 使用JNI访问字段

Java 使用JNI访问字段,java,c,java-native-interface,Java,C,Java Native Interface,我有一个java类,它有两个字段——一个是私有的final double,另一个是私有映射;我为映射添加了一个公共getter方法。我使用JNI从我的C代码访问它们。我在通过字段获取地图时遇到问题,但通过以下方法获取地图时没有问题: // The following lines of code work just fine jclass jCls = (*env)->GetObjectClass(env,object); jfieldID dblFldId = (*

我有一个java类,它有两个字段——一个是私有的final double,另一个是私有映射;我为映射添加了一个公共getter方法。我使用JNI从我的C代码访问它们。我在通过字段获取地图时遇到问题,但通过以下方法获取地图时没有问题:

    // The following lines of code work just fine
    jclass jCls = (*env)->GetObjectClass(env,object);
    jfieldID dblFldId = (*env)->GetFieldID(env,jCls,"nameOfDoubleVariable","D");
    jdouble dblVar = (*env)->GetDoubleField(env, object, dblFldId);

    // These lines don't work though
    jfieldID mapId = (*env)->GetFieldID(env,jCls,"nameOfMapVariable","()Ljava/util/Map;");
    jobject mapVar = (*env)->GetObjectField(env,object,mapId);
但是,如果我用以下内容替换不起作用的两行(基本上,我是通过方法而不是直接通过字段获取地图),它确实起作用:

    jmethodID m_GetMap = (*env)->GetMethodID(env,jCls,"getMap","()Ljava/util/Map;");
    jobject mapVar = (*env)->CallObjectMethod(env,object,m_GetMap);

有谁能告诉我为什么方法调用可以工作,但不能从字段中获取它-我肯定我做错了什么

错误是您试图获取带有函数签名的字段。 试试这个:

jfieldID mapId = (*env)->GetFieldID(env,jCls,"nameOfMapVariable","Ljava/util/Map;");

错误是您试图获取具有函数签名的字段。 试试这个:

jfieldID mapId = (*env)->GetFieldID(env,jCls,"nameOfMapVariable","Ljava/util/Map;");

谢谢Istvan Pecznyik-有时候只需要第二双眼睛:)@user1759789道德:不要试图自己编造JNI签名。使用
javap-s
的输出。这从来都没有错。EJP没有编造它-我没有那么有创意:)。复制和粘贴咬我的后面!再次感谢Istvan Pecznyik回答这个问题!谢谢Istvan Pecznyik-有时候只需要第二双眼睛:)@user1759789道德:不要试图自己编造JNI签名。使用
javap-s
的输出。这从来都没有错。EJP没有编造它-我没有那么有创意:)。复制和粘贴咬我的后面!再次感谢Istvan Pecznyik回答这个问题!