передача массива строк из java в C с помощью JNI

#java #c #java-native-interface

#java #c #java-native-interface

Вопрос:

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

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

Ответ №1:

Вы можете написать простую функцию, которая принимает 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.
    }
}
  

Комментарии:

1. требуется ли jobject object ввод?

2. Нужно ли мне вызывать DeleteLocalRef временный jstring объект, возвращаемый GetObjectArrayElement ?

Ответ №2:

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

И если вы не знаете об этом, книга JNI является ценным справочником.

Комментарии:

1. спасибо для справки. Я прочитал это. Я решил свою проблему с отправкой строки на сторону C. Я попытался отправить массив для практики и добился успеха. Спасибо за помощь. Есть два правильных ответа, и если вы не возражаете, я хочу дать оценку 8ball …

2. Ссылка на «JNI Book» не работает.

Ответ №3:

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

 (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
}
  

Комментарии:

1. Как насчет ReleaseStringUTFChars ?

Ответ №4:

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

 env->GetArrayLength(stringArray);