Правильное преобразование JNI, получающее элементы массива из jobjectarray в отдельный const char

прошу прощения за то, что я немного новичок в среде c ++ jni

Я пытаюсь передать массив String [] из java через мост JNI в c ++, следуя советам, которые я нашел здесь и дающих этот фрагмент:

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

Я пробовал это разными способами в своем коде, но я все еще получаю «непоправимую ошибку» от logcat, и мое приложение останавливается. Пожалуйста, посмотрите на мой код и помогите. Огромное спасибо заранее.

Мой код:

JNIEXPORT void Java_ran_com_FirstActivity_Example(
JNIEnv *javaEnvironment, jobject self, jobjectArray stringArray, jlongArray params) {
// Convert the input jlong array to a regular int array.
jlong *longParams = javaEnvironment->GetLongArrayElements(params, JNI_FALSE);
int arr[6];
for (int n = 0; n < 6; n++) arr[n] = longParams[n];
javaEnvironment->ReleaseLongArrayElements(params, longParams, JNI_ABORT);int stringCount = javaEnvironment->GetArrayLength(stringArray);

for (int i=0; i<stringCount; i++) {
jstring string = (jstring) (javaEnvironment->GetObjectArrayElement(stringArray, 2));
const char *rawString = javaEnvironment->GetStringUTFChars(string, 0);
// a method I created
example = new Example(rawString, arr);
javaEnvironment->ReleaseStringUTFChars(string, rawString);
}

}

1

Решение

int stringCount = javaEnvironment->GetArrayLength(stringArray);

for (int i=0; i<stringCount; i++) {
jstring string = (jstring) (javaEnvironment->GetObjectArrayElement(stringArray, 2));

Возможно, вы действительно намеревались вызвать следующую строку, чтобы перечислить все строки в stringArray,

    jstring string = (jstring)(javaEnvironment->GetObjectArrayElement(stringArray, i);
//i, not 2
1

Другие решения

Большое спасибо, Тимрау, за то, что дали мне уверенность в том, чтобы глубже заглянуть в мой код «jni» Наконец, я решил эту проблему, извлекая строки в символы, прежде чем передать их в методы, в которых я буду их использовать.

JNIEXPORT void Java_ran_com_FirstActivity(JNIEnv *javaEnvironment, jobject self, jobjectArray stringArray) {

int stringCount = javaEnvironment->GetArrayLength(stringArray);

for (int i=0; i<stringCount; i++) {
jstring string = (jstring) (javaEnvironment->GetObjectArrayElement(stringArray, 0));
const char *rawString = javaEnvironment->GetStringUTFChars(string, JNI_FALSE);

jstring istring = (jstring) (javaEnvironment->GetObjectArrayElement(stringArray, 1));
const char *rawStringb = javaEnvironment->GetStringUTFChars(istring, JNI_FALSE);
// I extracyed both string items to different chars before passing //to my methods...since jni only support passing two custom parameters
example = new SuperpoweredExample(rawString, rawStringb);
javaEnvironment->ReleaseStringUTFChars(string, rawString);
javaEnvironment->ReleaseStringUTFChars(istring, rawStringb);
}

}
1

По вопросам рекламы [email protected]