使用 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的int参数

将长值列表转换为逗号分隔以及每个值周围的括号

java 通过jni 向 c 传递一个 java 对象, c 如何取得这个对象的属性值?

将长 Unicode 字符串传递给 FireDac TADQuery 参数

JNI维数组:将二维数组从java传递给c

JNI 回调传递给 C