2016-10-14 5 views
0

私は2つのフィールドを持つJavaクラスを持っています.1つはプライベートな最終ダブルで、もう1つはプライベートマップです。私はマップのパブリックゲッターメソッドを追加しました。私はJNIを使​​って自分のCコードからそれらにアクセスしています。私は、フィールドを経由して地図を取得して問題を有するが、メソッドを介してそれを得る何の問題もないのです。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); 

をしかし、私は基本的に私は経由してマップを取得しています(以下では動作しない2本のラインを交換する場合代わりに、直接フィールド経由)メソッドは、それが作業を行います。

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それを作っていない - 私はその創造的ではない:)。後ろにビットをコピーして貼り付けてください!質問に答えるためにIstvan Pecznyikにもう一度感謝します! – user1759789

関連する問題