#java #android #reference #java-native-interface #arguments
#java #Android #ссылка #java-native-interface #аргументы
Вопрос:
У меня есть поток в моем собственном коде (c ), и этот поток вызывает функцию обратного вызова в java с переданным целым числом в agument . Функция обратного вызова в java должна изменить это целое число и возвращает true или false . Машинный код должен работать с новым (измененным) целым числом.
Пример кода:
C-код:
doSomething()
{
int id = 5;
callback_fct(amp;id)
}
callback_fct(int* id)
{
jclass integerClass = (env)->FindClass("java/lang/Integer");
jmethodID midConstructor = (env)->GetMethodID(integerClass, "<init>", "(I)V");
jmethodID midIntValue = (env)->GetMethodID(integerClass, "intValue", "()I");
jobject integerObject = (env)->NewObject(integerClass, midConstructor, *id);
//id should be 5
int res = env->CallIntMethod(appl_object, mid, integerObject);
*id= env->CallIntMethod(integerObject, midIntValue);
//id should be 99 now
}
Java-Code:
private int callback( Integer ID)
{
Log.i("JavaWrapper", "callback");
Log.i("JavaWrapper", "Old ID: " ID); //should be 5
ID = 99;
Log.i("JavaWrapper", "New ID: " ID); //should be 99
return 0;
}
Может кто-нибудь дать мне короткий пример для этого?
Спасибо
Комментарии:
1. Все целые числа неизменяемы. Как примитивные, так и упакованные целые числа являются неизменяемыми (в отношении передачи аргументов и их изменения). Вы можете обойти это, создав свой собственный класс (инкапсулируя целое число) или используя целочисленный массив (и установив для первого элемента значение, чтобы изменить обратный вызов заменяет значение, но повторно использует тот же объект массива). Итак, это то, что вы должны передать.
2. Это также помогает вашему делу, тратя время на заполнение личных данных и зарабатывая хотя бы одну репутацию на сайте, но, возможно, вы не собираетесь этого делать, отсюда и ваше имя пользователя user1002933. Удачи в получении полезного ответа.