Возвращает массив String по методу JNI
Мне нужно получить список строк (char *) из С++ и вернуть его на Java.
Как я могу это сделать?
Я думаю, что одно решение возвращает большую строку, предварительно определенную как: "[item1] [item2]" и сделать разделение на Java, но это не похоже на правильный подход.
Ответы
Ответ 1
Посмотрите NewObjectArray
в документ JNI.
В принципе, вы можете вернуться из JNI-функции Array Of String (Java), а затем преобразовать ее в List
или любой тип коллекции.
Код Peudo:
Java:
....
public List<String> getFooAsList(){
return new ArrayList(this.getData());
}
private native String[] getData();
JNI
#include <jni.h>
JNIEXPORT jobjectArray JNICALL
como_foo_bar_getData
(JNIEnv *env, jobject jobj){
jobjectArray ret;
int i;
char *data[5]= {"A", "B", "C", "D", "E"};
ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));
return(ret);
}
Не тестировалось!!!
Сообщите мне, если он работает для u
Привет
Ответ 2
ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
Я думаю, что начальный элемент, инициализированный символом "" (пустая строка)
env->NewStringUTF("")
не требуется, поскольку вы назначаете новое значение элементу массива сразу после:
for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));
Простой "NULL" будет достаточно в этом случае, поскольку указанный начальный элемент будет подбираться для сбора мусора, как только будет выполнена следующая строка. Это похоже на запись следующего кода Java:
int i = 0;
i = 1;
Или хуже:
Object object = new BigObjectVeryHeavyToInitialize();
object = new AnotherObject();
Ваша любимая IDE выдаст вам небольшое предупреждение для этого.