[英]Java JNI: How to set String [ ] field Of Java class from native method of C++
[英]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
您需要做的是使用GetMethodID
從Set
對象獲取方法,然后調用它們。
這樣,您可以下降到存儲在Set
數據。 在您的情況下,您必須:
GetMethodID
(並將Set
對象傳遞給它)以從Set
獲取Iterator
https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#iterator()
為Iterator
類的對象調用方法GetMethodID
,因此您可以獲得兩個方法: hasNext
和next
然后,您必須使用 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.