使用 JNI 将长值传递给 Java
Posted
技术标签:
【中文标题】使用 JNI 将长值传递给 Java【英文标题】:Passing long value to Java with JNI 【发布时间】:2015-03-29 07:01:17 【问题描述】:我正在尝试通过 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
。
这段代码有什么问题?或者,也许还有另一种方法可以做我想做的事?
【问题讨论】:
【参考方案1】:jlong
类型的签名是J
。另请注意,C++ long
有 32 位,因此它等同于 jint
,此处无需使用 jlong
。但您也可以将long
分配给jlong
。它会自动转换。
所以方法调用应该是这样的:
QAndroidJniObject res = activity.callObjectMethod("process", "(J)Ljava/lang/String;", thisAddress);
【讨论】:
这是另一个技巧:如果我使用短签名,java 方法根本不会调用。我将简单的调试输出放入其中,在这样的调用之后没有任何反应。【参考方案2】:好的。正如@Nejat 建议的那样,我设法通过使用短签名“J”将 Float 替换为浮动来解决我的问题。
所以现在看起来像这样 Qt:
QAndroidJniObject res = activity.callObjectMethod("process", "(J)Ljava/lang/String;", (jlong)thisAddress);
Java:
public String process(long clientAddr)
【讨论】:
以上是关于使用 JNI 将长值传递给 Java的主要内容,如果未能解决你的问题,请参考以下文章
java 通过jni 向 c 传递一个 java 对象, c 如何取得这个对象的属性值?