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.