2015-12-24 3 views
0

Я пытаюсь создать ArrayList, который содержит класс Java, вызывая его методы с помощью встроенной функции. Java класс ExampleClass выглядит так:JNI - запускать Java ArrayList из C++ Vector

public class ExampleClass { 
    private int _exampleID; 
    private String _exampleName; 
    public ExampleClass(int exampleID, String exampleName) { 
     _exampleID = exampleID; 
     _exampleName = exampleName; 
    } 
} 

На родной стороне у меня есть бесплатный класс ExampleClass_Cpp, который загружается в вектор. Вот нативная реализация:

static thread_local JNIEnv* env; 
static jclass java_util_ArrayList = static_cast<jclass>(env->NewGlobalRef(env->FindClass("java/util/ArrayList"))); 
static jmethodID java_util_ArrayList_= env->GetMethodID(java_util_ArrayList, "<init>", "(I)V"); 
jmethodID java_util_ArrayList_add = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)V"); 

JNIEXPORT jobject JNICALL cppv2javaAL(JNIEnv *env) { 

    std::vector<ExampleClass_Cpp> vector; 
    jclass J_Class_Example = env->FindClass("app/androidndkproject/ExampleClass"); 
    jmethodID methodId = env->GetMethodID(J_Class_Example, "<init>", "(I)V"); 

    jobject result = env->NewObject(java_util_ArrayList, java_util_ArrayList_, vector.size()); 
    for (auto const &Ex: vector) { 
     jobject J_Obj_Example = env->NewObject(J_Class_Example, methodId, Ex.getExampleID(), Ex.getExampleName()); 
     env->CallVoidMethod(result, java_util_ArrayList_add, J_Obj_Example); 
     env->DeleteLocalRef(J_Obj_Example); 
    } 
    return result; 
} 

У меня возникли трудности с соответствующим сопоставлением JNI. Мой настоящий Java-вызов, который, как я знаю, неверен, выглядит следующим образом: public native ArrayList<ExampleClass> cpp2java();.

Каков правильный способ создания ArrayList через JNI (или что не так с вышеуказанным)? Должно ли это быть jobjectArray?

Если она была написана на Java (контекст, я хотел бы использовать его) было бы:

public List<ExampleClass> exampleList = new ArrayList<ExampleClass>();

Спасибо заранее.

ответ

1

Во-первых, ArrayList.add() возвращает логическое значение, вы должны использовать

CallBooleanMethod 

Может быть, есть лучший способ, но из моего опыта, вы можете

создать пустой список в Java

public List<ExampleClass> exampleList = new ArrayList<ExampleClass>() 

проход exampleList в качестве ссылки на CPP, СТГ, как:

JNIEXPORT jobject JNICALL cppv2javaAL(JNIEnv *env, jobject jlist) { 
... 
env->CallBooleanMethod(jlist, java_util_ArrayList_add, J_Obj_Example); 
... 
} 
+0

Спасибо за ввод. Как вы назовете 'cppv2javaAL' в Java? ('public native ...? ... cppv2javaAL (exampleList);' – Austin

+0

yes, просто создайте собственный Java-метод, который отображает cppv2javaAL – huluyige

+0

Как в мире вы объявляете ** java_util_ArrayList ** в JNI? –

Смежные вопросы