Android — передача длинных значений в Java с помощью JNI

Я пытаюсь передать указатель на объект из кода C ++ в метод Java через JNI, чтобы позже преобразовать его обратно в указатель в обратном вызове.

void Client::process()
{
long thisAddress = (long)this;
QAndroidJniObject res = activity.callObjectMethod("process", "(Ljava/lang/Long;)Ljava/lang/String;", (jlong)thisAddress);
}

Прототип Java-функции public String process(Long clientAddr)
и вот красота, которую печатает мне JVM: Invalid indirect reference 0x5f3d9bc8 in decodeIndirectRef,

Что не так с этим кодом? Или, может быть, есть другой способ сделать то, что я хочу?

2

Решение

Подпись для вида jlong является J, Также обратите внимание, что C ++ long имеет 32 бита, так что это эквивалентно jint и нет необходимости использовать jlong Вот. Но вы также можете назначить long к jlong, Это будет преобразовано автоматически.

Таким образом, вызов метода должен выглядеть так:

QAndroidJniObject res = activity.callObjectMethod("process", "(J)Ljava/lang/String;", thisAddress);
2

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

Хорошо. Мне удалось исправить мою проблему, заменив Float на float, используя вместо этого короткую подпись «J», как и предложил @Nejat.

Так что теперь это выглядит так
Qt:

QAndroidJniObject res = activity.callObjectMethod("process", "(J)Ljava/lang/String;", (jlong)thisAddress);

Джава:

public String process(long clientAddr)
1

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