jni jiniArray как выходной параметр не меняет значения параметра - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь вызвать статический метод Java из программы на C ++, у меня есть этот код Java:

public static int[] arrayFunc(int [] array) {
    int [] newArray = copyOf(array, array.length);
    for(int i = 0; i < newArray.length; ++i) {
        newArray[i] += 1;
    }
    return newArray;
}

Затем в коде cpp у меня есть:

// JNIEnv *env is created before I call function
jintArray CallStaticFunction(const char* functionName, const int* parameter, const size_t size) {
    jmethodID mid = env->GetStaticMethodID(cls, functionName, "([I)[I");
    for(size_t i=0;i<size;++i) {
        printf("parameter = %d\n", parameter[i]);
    }
    if (mid) {
        jintArray iarr = env->NewIntArray(size);
        env->SetIntArrayRegion(iarr, 0, size, parameter);
        jintArray array = (jintArray)env->CallStaticObjectMethod(cls, mid, iarr);
        return array;
    } else {
        printf("find statis int method failed\n");
        exit(3);
    }
}

ИВ main.cpp я имею:

env = ... //all the jvm initializatin work
int buf[3];
for(int i=0;i<3;++i){
    buf[i] = i;
}
jintArray ret = CallStaticFunction("arrayFunc", buf, 3);
for(int i=0;i<3;++i){
    printf("%d\n", ret[i]);
}

Вывод:

parameter = 0
parameter = 1
parameter = 2
0
0
0

Я ожидал, что последние 3 строки должны быть "1 2 3".Но на самом деле нет.Так где же я ошибся в своей программе и как ее исправить?

Большое спасибо.

1 Ответ

0 голосов
/ 16 февраля 2019

Вы не можете получить доступ к jintArray как к обычному массиву C.Чтобы получить доступ к данным, вам необходимо использовать соответствующие функции JNI:

jintArray ret = CallStaticFunction("arrayFunc", buf, 3);
int *p = env->GetIntArrayElements(ret, NULL);
for(int i=0;i<3;++i){
    printf("%d\n", p[i]);
}
env->ReleaseIntArrayElements(ret, p, JNI_ABORT);

Более подробную информацию о работе этих функций см. В документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...