簡體   English   中英

如何領取一套<String>由C++ JNI中的java方法返回,我們可以將jobject轉換為set<String> ?

[英]How to receive a set<String> returned by java method in C++ JNI, can we Convert jobject to set<String>?

我正在使用 JNI 從 C++ 調用 Java 類的實例方法。 我的 Java 方法返回集,我需要在 C++ 中捕獲它。有人可以幫忙嗎?

我的 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,甚至能夠執行該方法。

我試圖在 set 中輸入 cast jobject 但失敗了。 我可以直接在一個集合中捕獲這個或者我可以將 jobject 轉換為 set 嗎?

我想打印java函數返回的信息。請幫忙?

您必須訪問Set類方法並檢索存儲在集合中的對象。

我沒有現成的集合示例,但它與您可以在此處找到的代碼非常相似:

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

您需要做的是使用GetMethodIDSet對象獲取方法,然后調用它們。

這樣,您可以下降到存儲在Set數據。 在您的情況下,您必須:

  • 調用方法GetMethodID (並將Set對象傳遞給它)以從Set獲取Iterator

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

  • Iterator類的對象調用方法GetMethodID ,因此您可以獲得兩個方法: hasNextnext

  • 然后,您必須使用 Iterator 迭代Set並一個一個地檢索元素(它們將是jobject的類型)

你也可以看看這里:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/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);

  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM