передача массива строк из Java в C с помощью JNI - PullRequest
30 голосов
/ 12 мая 2011

У меня есть строковый массив типа {"myname","yourname","hisname"}, и я пытаюсь отправить этот массив на C с использованием JNI . Я не мог найти четкого решения для этого. Я пытался принять эту строку как chararray, но безуспешно.

Есть ли способ сделать это?

Ответы [ 4 ]

80 голосов
/ 12 мая 2011

Вы можете написать простую функцию, которая принимает объект jobjectArray, приводить каждый к jstring и затем вызывать GetStringUTFChars для него.

Как это:

void MyJNIFunction(JNIEnv *env, jobject object, jobjectArray stringArray) {

    int stringCount = env->GetArrayLength(stringArray);

    for (int i=0; i<stringCount; i++) {
        jstring string = (jstring) (env->GetObjectArrayElement(stringArray, i));
        const char *rawString = env->GetStringUTFChars(string, 0);
        // Don't forget to call `ReleaseStringUTFChars` when you're done.
    }
}
9 голосов
/ 12 мая 2011

Да, есть способ.Вы бы передали String[] в свой нативный метод со стороны Java, и это перешло бы на сторону C / C ++ как jobjectArray.Затем вы должны использовать GetObjectArrayElement(), чтобы получить jstring по данному индексу, а затем использовать GetStringUTFChars() или GetStringChars(), чтобы получить указатель C / C ++ на базовые строковые данные.

И если вы неНе знаю об этом, Книга JNI является ценной ссылкой.

1 голос
/ 25 мая 2012

это можно сделать следующим образом:

(JNIEnv *env, jobject object, jobjectArray prdctini)
    {
        const char *param[20];
        jsize stringCount = (*env).GetArrayLength(prdctini);

          for (int i=0; i<stringCount; i++) {
                  jstring string = (jstring) (*env).GetObjectArrayElement( prdctini, i);
                  param[i] = (*env).GetStringUTFChars( string, NULL);
          }
          cout<<"U_Id="<<param[0]<<endl;
          cout<<"aggregation="<<param[1]<<endl
}
0 голосов
/ 15 февраля 2013

Не забудьте использовать

env->GetArrayLength(stringArray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...