Передача Java ArryList <String>в функцию JNI C и распечатка списка в C - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующий нативный метод в Java:

public class ConsoleIO
{

    public native static void printList(List<String> list);

   ......
}

, и соответствующая реализация C с JNI выглядит следующим образом:

JNIEXPORT void JNICALL Java_ConsoleIO_printList(JNIEnv *env, jclass cls, jobject obj)
{



}

Теперь мне нужно передать список строкиз java в метод printList (List list), переберите его из вышеприведенной реализации C и напечатайте их в консоли из функции C.

Я знаю, что в C нет представления этого типа List, но мне нужно знать, как я могу получить доступ к этому списку строк в C и распечатать их в самом C?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Я нашел решение для этого:

JNIEXPORT void JNICALL Java_ConsoleIO_printList(JNIEnv *env, jclass cls, jobject obj)
{

    jclass listClass = (*env)->GetObjectClass(env,obj);

    jmethodID sizeMethod = (*env)->(env,listClass,"size","()I");
    jmethodID getMethod = (*env)->GetMethodID(env,listClass,"get","(I)Ljava/lang/Object");

    jint size =  (*env)->CallIntMethod(env,sizeMethod);


}
0 голосов
/ 17 октября 2018

Java имеет Тип Erasure .Таким образом, List<String> становится List в скомпилированном коде.

Итак, что вы действительно ищете, это реализовать следующие вызовы Java с использованием JNI:

jint size = list.size();
for (jint i = 0; i < size; i++) {
    jobject elem = list.get(i);
    jstring str = (jstring)elem;
    ... print str ...
}

В приведенном выше коде C, list.size() и list.get() должны быть заменены вызовами GetMethodID, CallIntMethod и CallObjectMethod.Строка может быть получена из str с использованием GetStringChars или GetStringUTFLength.И некоторое управление памятью необходимо: ReleaseXXX.

...