使用JNI访问字段

时间:2016-10-14 19:58:51

标签: java c java-native-interface

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

    // 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);

任何人都可以告诉我为什么方法调用有效但没有从现场获取 - 我确信我做错了什么!

1 个答案:

答案 0 :(得分:2)

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

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