示例.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:
CALLBACK_START("handleSampleData",**XXXX**, objectReference);
if(mid != NULL){
env->CallVoidMethod(reference_->handler_object, mid, **YYYY**);
}
DETACH_FROM_VM(reference_);
这里 XXXX 是签名,YYYY 是JNI 数据类型
如何为 std::list<std::string> lst
使用签名和 JNI 类型在 Java 中获取我的 lst ArryList<String>
测试.java:
public void handleSampleData(ArrayList<String> arrSample){
}
最佳答案
简单的答案,迭代地将它复制到您在 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);
关于java - 如何将 JNI C 中的 std::list<std::string> 发送到 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23904821/