java - 如何将 JNI C 中的 std::list<std::string> 发送到 Android

标签 java android c list java-native-interface

示例.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/

相关文章:

java - 如果我运行我的代码,我将获得多少内存?

java - Android 应用程序上的 Google +1 按钮错误是暂时的

android - 如何以编程方式创建 ColorStateList?

c - 将部分注入(inject) GNU ld 脚本; binutils 版本之间的脚本兼容性。

c - 为什么下面代码中的 for 循环不作为无限循环运行(我在 -1 之后继续作为 1 2 3...-3 -2 -1)?

java - Joda Time - 给定时间段内的时间段?

java - 从 java 程序运行时,任务栏中的 exe 内存大小不会增加太多

java - 如何打开程序并检测程序何时关闭

java - 动态地将textview放在relativelayout android中的另一个 View 之上

c++ - 计算线段与trimesh交点的代码