#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);