iro*_*xxx 7 c++ java java-native-interface
美好的一天,我试图使用JNI将Java字符串数组复制到C++数组.我试过这个,但似乎没有工作.
char *myarray;
JNIEXPORT void JNICALL
Java_com_Example_accessArray(JNIEnv *env, jobject obj, jobjectArray stringArrays){
int size;
size = env->GetArrayLength(stringArrays);
myarray = env->GetCharArrayRegion(stringArrays, 0, size, null);
}
Run Code Online (Sandbox Code Playgroud)
myarray在传递的Java数组中是否保持相同的值?或者如何将通过JNI传递的java String数组的值复制到C++数组中,因此C++中的数组是否具有相同的值?提前致谢.
您传递了一个对象数组,因此您不能只从此数组中获取字符.一种方式是这样的:
int size = env->GetArrayLength(stringArrays);
for (int i=0; i < size; ++i)
{
jstring string = env->GetObjectArrayElement(stringArrays, i);
const char* mayarray = env->GetStringUTFChars(string, 0);
.... do some work or copy it to a c++ array of char*....
env->ReleaseStringUTFChars(string, myarray);
env->DeleteLocalRef(string);
}
Run Code Online (Sandbox Code Playgroud)
这是我用来将Java字符串数组String[]转换为C++的代码vector<string>:
void Java_com_domain_project_activity_stringArrToStringVector(JNIEnv *env, jobject obj, jobjectArray jstringArr) {
vector<string> stringVec;
// Get length
int len = env->GetArrayLength(jstringArr);
for (int i=0; i<len; i++) {
// Cast array element to string
jstring jstr = (jstring) (env->GetObjectArrayElement(jstringArr, i));
// Convert Java string to std::string
const jsize strLen = env->GetStringUTFLength(jstr);
const char *charBuffer = env->GetStringUTFChars(jstr, (jboolean *) 0);
string str(charBuffer, strLen);
// Push back string to vector
stringVec.push_back(str);
// Release memory
env->ReleaseStringUTFChars(jstr, charBuffer);
env->DeleteLocalRef(jstr);
}
}
Run Code Online (Sandbox Code Playgroud)
在Java方面,该函数将如下所示:
void stringArrToStringVector(String[] jstringArr);
Run Code Online (Sandbox Code Playgroud)
最后,作为旁注,要从Java字符串列表转换为字符串数组(您将传递给JNI函数),您可以执行以下操作:
List<String> strList = new ArrayList<>();
// Populate strList
String[] strArr = new String[strList.size()];
strList.toArray(strArr);
Run Code Online (Sandbox Code Playgroud)