Mik*_*kia 4 c++ java string java-native-interface arraylist
我试图用C++中的JNI进行数据转换.我曾经接触过的工作麻烦的Java的ArrayList中的字符串,因为我一直没能到这样的数据转换成C++ 载体或的std :: string*.
我想知道如果可能的话,如何在不牺牲太多性能的情况下进行转换.任何想法,将不胜感激.
ppr*_*sch 10
我不知道这是否符合您的性能要求,但它可能是一个良好的开端.
对于这两个选项,假设这jobject jList;是您的ArrayList.
将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;
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用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;
}
Run Code Online (Sandbox Code Playgroud)
_edited:用NULL__edited
替换JNI_FALSE:用push_back_替换插入