使用JNI将长值传递给Java 我试图通过JNI将对象指针从C++代码传递到java方法,以在以后回调中将其转换回指针。 void Client::process() { long thisAddress = (long)this; QAndroidJniObject res = activity.callObjectMethod("process", "(Ljava/lang/Long;)Ljava/lang/String;", (jlong)thisAddress); }

使用JNI将长值传递给Java 我试图通过JNI将对象指针从C++代码传递到java方法,以在以后回调中将其转换回指针。 void Client::process() { long thisAddress = (long)this; QAndroidJniObject res = activity.callObjectMethod("process", "(Ljava/lang/Long;)Ljava/lang/String;", (jlong)thisAddress); },android,c++,qt,java-native-interface,qtandroidextras,Android,C++,Qt,Java Native Interface,Qtandroidextras,Java函数原型是公共字符串processLong ClientAddress JVM向我展示了一个美丽之处:decodeIndirectRef中的无效间接引用0x5f3d9bc8 这个代码有什么问题?或者,也许还有另一种方法来做我想做的事情。 < P>一种JLon类型的签名是J.也注意到C++长有32位,所以它相当于一个JNT,并且不需要在这里使用JLUN。但您也可以将long指定给jlong。它将自动转换 因此,方法调用应该如下所示: QAndroidJniObject res = acti

Java函数原型是公共字符串processLong ClientAddress JVM向我展示了一个美丽之处:decodeIndirectRef中的无效间接引用0x5f3d9bc8


这个代码有什么问题?或者,也许还有另一种方法来做我想做的事情。

< P>一种JLon类型的签名是J.也注意到C++长有32位,所以它相当于一个JNT,并且不需要在这里使用JLUN。但您也可以将long指定给jlong。它将自动转换

因此,方法调用应该如下所示:

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

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

所以现在看起来是这样的 Qt:

爪哇:


这是另一个技巧:若我使用短签名,那个么java方法根本不会调用。我将简单的调试输出放入其中,在这样的调用之后什么也没有发生。
QAndroidJniObject res = activity.callObjectMethod("process", "(J)Ljava/lang/String;", (jlong)thisAddress);
public String process(long clientAddr)