2017-11-17 51 views
0

JNIを使​​用してC++からJavaクラスのインスタンスメソッドを呼び出しています。 Javaのメソッドが返され、C++でこれをキャッチする必要があります。誰かが助けてくれますか?C++ JNIでJavaメソッドから返された<String>のセットを受け取る方法は、jobjectを<String>に変換できますか?

Javaメソッドは以下のようになります。

@Override 
public Set<String> getRealmRights() 
{ 
    Set<String> realmRights = new HashSet<>(); 
    ----------------- 
    ----------------- 
    return realmRights; 
} 

私は以下のようにC++からメソッドを呼び出しています。

jmethodID getRealmRightsMethodId = env->GetMethodID(keycloakAdapterApplicationClassId, "getRealmRights", "()Ljava/util/Set;"); 
if(getRealmRightsMethodId != nullptr) 
{ 
    jobject rights = (jobject) env->CallObjectMethod(keycloakAdapterApplication, getRealmRightsMethodId); 
    //@ this stage I want to read the information from jobject,Please help? 
} 

メソッドIDを正しく取得でき、メソッドを実行することもできます。

キャストジョブオブジェクトを設定しようとしましたが失敗しました。これを直接キャッチすることはできますか?それとも、私はjobjectをセットに変換できますか?

私はJava関数によって返された情報を印刷したいと思います。助けてください?

+2

「キャッチする」_とはどういう意味ですか? 'Set'は' jarray'ではなく、 'jobject'です。セット内の要素にアクセスするには、たとえば次のようにします。あなたのJavaコードで 'toArray'を使って' Set 'の代わりに' String [] 'を返してください。なんらかの理由でJavaコードを変更できない場合は、C++( 'GetObjectClass'、' GetMethodID'、 'CallObjectMethod'など)から同じことをすることができます。 – Michael

+0

私はjobjectの情報を受け取りました。どうすればそれを読むことができますか教えてください。 jobjectは、タイプの値を保持しています。 – kunal

+1

あなたが呼び出す 'Set'メソッドのID(' toArray'など) 'Set'クラスへの参照を取得するために、私が言及した関数を使用して、そのメソッドを呼び出します。 'jobjectArray'を取得したら、それをいつものように処理します。これはすべて標準のJNIプログラミングです(https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.htmlを参照)。そのため、問題が何であるかが明確にはわかりません。 – Michael

答えて

1

Setクラスメソッドにアクセスし、コレクション内に格納されているオブジェクトを取得する必要があります。

私はセット用の箱のサンプルのうち、持っていないが、それはあなたがここに見つけることができるコードと非常によく似ています:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo037

あなたがする必要がどのような、方法を取得することですGetMethodIDを使用してSetオブジェクトから呼び出してから呼び出してください。

このようにして、Setに格納されているデータに降下することができます。あなたのケースでは、あなたが持っている:

  • 呼び出し方法GetMethodID(およびそれにSetオブジェクトを渡す)のオブジェクトに対してIteratorからSet

https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#iterator()

  • 呼び出し方法GetMethodIDを取得しますクラスIteratorの2つの方法があります:hasNextnext

  • そして、あなたはIteratorを使用してSetを反復処理し、要素を一つずつ取得する必要が(彼らはjobjectの型になります)

あなたもここで見ることができます:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo042

/* Get objarg's class - objarg is the one we pass from 
    Java */ 
    jclass clsSet = (*env)->GetObjectClass(env, objarg); 

    /* Use javap to get propper descriptor 
    > javap -s -p java.util.Set | grep -A 1 toArray 
     public abstract java.lang.Object[] toArray(); 
      descriptor:()[Ljava/lang/Object; 
    */ 

    jmethodID midToArray = 
    (*env)->GetMethodID(env, clsSet, "toArray", "()[Ljava/lang/Object;"); 

    /* We have to make sure that method exists */ 
    if (midToArray == NULL) { 
    return -1; /* method not found */ 
    } 

    /* Once we have method, we can call "toArray" and this way 
    get array of all keys */ 
    jobjectArray arrayOfElements = (*env)->CallObjectMethod(env, objarg, midToArray); 

    /* We will iterate over the array so we can get value for each key */ 
    int arraySize = (*env)->GetArrayLength(env, arrayOfElements); 

    /* We want to go over all elements (all keys) */ 
    for (int i=0; i < arraySize; i++) 
    { 
    /* First, we need to get key value from array of all keys */ 
    jstring obj = (*env)->GetObjectArrayElement(env, arrayOfElements, i); 
    const char* c_string = (*env)->GetStringUTFChars(env, obj, 0); 

    /* We can print values passed to C from Java */ 
    printf("[value] = [%s]\n", c_string); 

    /* Make sure to release local stuff */ 
    (*env)->ReleaseStringUTFChars(env, obj, c_string); 

    } 
関連する問題