使用JNI将长值传递给Java

Passing long value to Java with JNI

本文关键字:Java 值传 JNI 使用      更新时间:2023-10-16

我正试图通过JNI将对象指针从C++代码传递到java方法,以便稍后在回调中将其转换回指针。

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);

好的。正如@Nejat所建议的那样,我通过使用短签名"J"将Float替换为Float来解决我的问题。

所以现在看起来是这样问题:

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

Java:

public String process(long clientAddr)