Dziwne: nie można zmienić wartości liczby całkowitej w jni

Piszę funkcję jni, aby ustawić wartość dwóch obiektów java Integer w C, tak jak poniżej:

jni_do_something(JNIEnv *env, jobject thiz, jobject p1, jobject p2) {
    jclass c;
    jfieldID id;
    c = env->FindClass("java/lang/Integer");
    if (c==NULL)
    {
        LOGD("FindClass failed");
        return -1;
    }

    id = env->GetFieldID(c, "value", "I");
    if (id==NULL)
    {
        LOGD("GetFiledID failed");
        return -1;
    }

    env->SetIntField(p1, id, 5);
    env->SetIntField(p2, id, 10);
    return 0;
}

W Javie nazwałem tę funkcję:

native int do_something(Integer p1, Integer p2);

Integer p1=0, p2=0;
do_something(p1, p2);
Log.d("test", "p1: "+p1);
Log.d("test", "p2: "+p2);

Dane wyjściowe to „10”, dlaczego?

===============================================

Wykonałem wiele testów i otrzymałem następujące punkty. (Odpowiedź, komentarze są mile widziane)

Nie sądzę, aby ten rodzimy jni nie mógł zmienić niezmiennego obiektu. W końcu oba obiekty są zmieniane na 10 z 0.

Istnieje pewien związek z auto-boxingiem (tak? Nie jestem pewien). Może p1 i p2 są specjalnie przetwarzane przez jvm, wskazane na pojedynczy obiekt, jeśli zainicjowano za pomocą:

Liczba całkowita p1 = 0, p2 = 0;

Jeśli zmienisz na:

Integer p1=0, p2=1;

lub

Integer p1 = new Integer(0);
Integer p2 = new Integer(0);

Wynik jest prawidłowy (p1: 5, p2: 10). Czy ktoś może to wyjaśnić?

Może to, co powiedziałem, jest nieprawidłowe. Napisałem następujący kod w java:

Integer a = 0;
Integer b = 0;
b = 10;
Log.d("test", "a: "+a);
Log.d("test", "b: "+b);

Wyprowadza 0, 10. Wskazują więc nie pojedynczy obiekt. Jestem bardzo zmieszany.

questionAnswers(2)

yourAnswerToTheQuestion