简体   繁体   English

如何发送std :: list <std::string> 在JNI C到Android

[英]How to send std::list<std::string> in JNI C to Android

sample.cc: sample.cc:

 std::list<std::string> lst;
 lst.push_back("this");
 lst.push_back("is");
 lst.push_back("test");
 lst.push_back("message");

java_c_reference.cc: java_c_reference.cc:

CALLBACK_START("handleSampleData",**XXXX**, objectReference);
if(mid != NULL){
env->CallVoidMethod(reference_->handler_object, mid, **YYYY**);
}
DETACH_FROM_VM(reference_);

Here XXXX is signature and YYYY is JNI datatype How to use a Signature and JNI type for std::list<std::string> lst to obtain my lst in Java ArryList<String> 这里XXXX是签名,而YYYY是JNI数据类型。如何对std::list<std::string> lst使用签名和JNI类型来在Java ArryList<String>获取我的lst。

Test.java: Test.java:

public void handleSampleData(ArrayList<String> arrSample){
}

The simple answer, Iteratively copy it to an ArrayList you construct in JNI and then pass that new object back to the JVM. 简单的答案是:将其迭代地复制到在JNI中构造的ArrayList中,然后将该新对象传递回JVM。

jclass ArrayList_class = (*env)->FindClass(env, "java/util/ArrayList");
ArrayList_init_id = (*env)->GetMethodID(env, ArrayList_class, "<init>", "()V");
ArrayList_add_id = (*env)->GetMethodID(env, ArrayList_class, "add", "(Ljava/lang/Object;)Z");
jobject List_obj = (*env)->NewObject(env, ArrayList_class, ArrayList_init_id);

// Begin psudo-code
foreach (item in lst) {
    (*env)->CallVoidMethod(env, List_obj, ArrayList_add_id, (*env)->NewStringUTF(env, item));
}

// Now pass List_obj to where ever it needs to go.

// I usually call DeleteLocalRef to make sure the objects get garbage collected.
(*env)->DeleteLocalRef(env, List_obj);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM