使用 JNI 将长值传递给 Java

问题描述 投票:0回答:2

我试图通过 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

这段代码有什么问题?或者,也许还有另一种方法可以做我想做的事?

android c++ qt java-native-interface qtandroidextras
2个回答
2
投票

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

所以现在看起来像这样 Qt:

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

Java:

public String process(long clientAddr)

2
投票

jlong
类型的签名是
J
。另请注意,C++
long
通常有 32 位,因此它相当于
jint
,这里不需要使用
jlong
。但您也可以将
long
分配给
jlong
。它会自动转换。

所以方法调用应该是这样的:

QAndroidJniObject res = activity.callObjectMethod("process", "(J)Ljava/lang/String;", thisAddress);
© www.soinside.com 2019 - 2024. All rights reserved.