java - JNI - java ArrayList 转换为 c++ std::string*

标签 java c++ string arraylist java-native-interface

我正在尝试使用 C++ 中的 JNI 进行数据转换。我在使用 javaArrayListstrings 时遇到了麻烦,因为我无法将这样的数据转换成 c++ vectorstd::string*

如果可能的话,我想知道如何在不牺牲太多性能的情况下进行这种转换。任何想法,将不胜感激。

最佳答案

我不知道这是否符合您的性能要求,但这可能是一个好的开始。

对于这两个选项,假设 jobject jList; 是您的 ArrayList。

选项 1

将 List 转换为数组并在数组上迭代(如果你有一个 LinkedList 而不是 ArrayList 可能更适用)

// retrieve the java.util.List interface class
jclass cList = env->FindClass("java/util/List");

// retrieve the toArray method and invoke it
jmethodID mToArray = env->GetMethodID(cList, "toArray", "()[Ljava/lang/Object;");
if(mToArray == NULL)
    return -1;
jobjectArray array = (jobjectArray)env->CallObjectMethod(jList, mToArray);

// now create the string array
std::string* sArray = new std::string[env->GetArrayLength(array)];
for(int i=0;i<env->GetArrayLength(array);i++) {
    // retrieve the chars of the entry strings and assign them to the array!
    jstring strObj = (jstring)env->GetObjectArrayElement(array, i);
    const char * chr = env->GetStringUTFChars(strObj, NULL);
    sArray[i].append(chr);
    env->ReleaseStringUTFChars(strObj, chr);
}

// just print the array to std::cout
for(int i=0;i<env->GetArrayLength(array);i++) {
    std::cout << sArray[i] << std::endl;
}

选项 2

另一种方法是使用 List.size()List.get(int) 方法从列表中检索数据。当您使用 ArrayList 时,此解决方案也可以,因为 ArrayList 是一个 RandomAccessList。

// retrieve the java.util.List interface class
jclass cList = env->FindClass("java/util/List");

// retrieve the size and the get method
jmethodID mSize = env->GetMethodID(cList, "size", "()I");
jmethodID mGet = env->GetMethodID(cList, "get", "(I)Ljava/lang/Object;");

if(mSize == NULL || mGet == NULL)
    return -1;

// get the size of the list
jint size = env->CallIntMethod(jList, mSize);
std::vector<std::string> sVector;

// walk through and fill the vector
for(jint i=0;i<size;i++) {
    jstring strObj = (jstring)env->CallObjectMethod(jList, mGet, i);
    const char * chr = env->GetStringUTFChars(strObj, NULL);
    sVector.push_back(chr);
    env->ReleaseStringUTFChars(strObj, chr);
}

// print the vector
for(int i=0;i<sVector.size();i++) {
    std::cout << sVector[i] << std::endl;
}

_edited:将 JNI_FALSE 替换为 NULL_
_edited:用 push_back 替换了 insert_

关于java - JNI - java ArrayList 转换为 c++ std::string*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24403340/

相关文章:

java - 如何通过java调用sharepoint 2007 webservices?

java - Eclipse/SWT : Rectangle taking up entire canvas

像python的 'groupby'这样的C++算法

string - Prolog 列表到逗号分隔的字符串

java - 使用 JMX 和 Jaas 进行 jconsole 身份验证

java - 如何在 JPA 中选择和订购 EmbeddedID

c++ - 为什么在另一个头文件中声明结构会导致LNK2001错误?

c++ - 为什么我得到 "end of file found before the left brace ' {' in hashtable.h(8)"?

c - 如何使 strtok 在标记末尾包含换行符?

c++ - 为什么 s.find 在失败时返回 string::npos 而不是 s.length()