2016-10-14 2 views
0

У меня есть класс java, который имеет два поля: один является частным финальным двойным, а другой - частной картой; Я добавил публичный метод getter для Карты. Я обращаюсь к ним с моего кода на C с помощью JNI. У меня возникли проблемы с получением карты через поле, но не имеют проблем с получением его с помощью метода:Доступ к полю с использованием JNI

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

Может кто-нибудь сказать мне, почему вызов метода работает, но не получает его с поля - Я уверен, что я делаю что-то неправильно!

ответ

2

Ошибка в том, что вы пытаетесь получить поле с сигнатурой функции. Попробуйте с этим:

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

спасибо Иштвана Pecznyik - иногда он просто принимает, что вторая пара глаз :) – user1759789

+2

@ user1759789 Мораль: не пытайтесь восполнить JNI подписи самостоятельно. Используйте вывод 'javap -s'. Это никогда не ошибается. – EJP

+0

EJP Не додумался - я не так креативен :). Скопируйте и вставьте бит в тыл! Еще раз спасибо Иштван Пексник за ответ! – user1759789

Смежные вопросы