Возвращает массив 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 выдаст вам небольшое предупреждение для этого.