C++通过JNI将vector<string>的数据传入到java中的string[]
时间: 2024-02-22 19:59:29 浏览: 169
Jni中C++和Java的参数传递
5星 · 资源好评率100%
可以通过以下步骤将 C++ 中的 `vector<string>` 数据传递到 Java 中的 `String[]` 数组中:
1. 编写 JNI 接口方法,接收 `vector<string>` 数据,并将其转换为 `jobjectArray` 对象:
```c++
JNIEXPORT jobjectArray JNICALL Java_com_example_MyClass_getStringArray(JNIEnv *env, jobject obj, jobject stringVector) {
jclass stringClass = env->FindClass("java/lang/String");
jmethodID stringConstructor = env->GetMethodID(stringClass, "<init>", "([BLjava/lang/String;)V");
std::vector<std::string> strVector;
getVectorData(stringVector, strVector);
jobjectArray stringArray = env->NewObjectArray(strVector.size(), stringClass, NULL);
for (int i = 0; i < strVector.size(); i++) {
jbyteArray bytes = env->NewByteArray(strVector[i].size());
env->SetByteArrayRegion(bytes, 0, strVector[i].size(), (jbyte*)strVector[i].data());
jstring encoding = env->NewStringUTF("UTF-8");
jobject stringObj = env->NewObject(stringClass, stringConstructor, bytes, encoding);
env->SetObjectArrayElement(stringArray, i, stringObj);
env->DeleteLocalRef(stringObj);
env->DeleteLocalRef(encoding);
env->DeleteLocalRef(bytes);
}
return stringArray;
}
```
其中,`getVectorData()` 是一个自定义的函数,用于从 `jobject` 对象中获取 `vector<string>` 数据。
2. 在 Java 代码中调用 JNI 接口方法,获取 `String[]` 数组:
```java
public class MyClass {
static {
System.loadLibrary("myLibrary");
}
public static native String[] getStringArray(Vector<String> stringVector);
public static void main(String[] args) {
Vector<String> stringVector = new Vector<>();
stringVector.add("Hello");
stringVector.add("world");
stringVector.add("!");
String[] stringArray = getStringArray(stringVector);
for (String str : stringArray) {
System.out.println(str);
}
}
}
```
在 Java 代码中,首先需要加载 C++ 的动态库,然后调用 JNI 接口方法 `getStringArray()`,将 `Vector<String>` 数据传递给 C++,并获取转换后的 `String[]` 数组。
阅读全文