【问题标题】:Passing long value to Java with JNI使用 JNI 将长值传递给 Java
【发布时间】: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

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

【问题讨论】:

    标签: android c++ qt java-native-interface qtandroidextras


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多