Я пытаюсь передать указатель на объект из кода 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
,
Что не так с этим кодом? Или, может быть, есть другой способ сделать то, что я хочу?
Подпись для вида jlong
является J
, Также обратите внимание, что C ++ long
имеет 32 бита, так что это эквивалентно jint
и нет необходимости использовать jlong
Вот. Но вы также можете назначить long
к jlong
, Это будет преобразовано автоматически.
Таким образом, вызов метода должен выглядеть так:
QAndroidJniObject res = activity.callObjectMethod("process", "(J)Ljava/lang/String;", thisAddress);
Хорошо. Мне удалось исправить мою проблему, заменив Float на float, используя вместо этого короткую подпись «J», как и предложил @Nejat.
Так что теперь это выглядит так
Qt:
QAndroidJniObject res = activity.callObjectMethod("process", "(J)Ljava/lang/String;", (jlong)thisAddress);
Джава:
public String process(long clientAddr)