【问题标题】:QAndroidJNI callMethod errorQAndroidJNI调用方法错误
【发布时间】:2017-11-23 18:19:42
【问题描述】:

我有以下在附件模式下打开 USB 端口的 java 函数。

public int openAccessory() throws Exception { /* Open stuff */ }
public int closeAccessory() throws IOException { /* Close stuff */ }

我从 C++ 调用这些函数,实例化一个名为 JavaObject 的 QAndroidJniObject,并执行以下调用:

int AOAConnection::Open() {
    JNIEnvironmentAttacher jea(&this->JNIE);
    return JavaObject.callMethod<jint>("openAccessory");
}

int AOAConnection::Close() {
    JNIEnvironmentAttacher jea(&this->JNIE);
    return JavaObject.callMethod<jint>("closeAccessory", "(V)I");
}

所以这段代码工作得很好而且花花公子,问题是如果我将第一个 C++ 调用更改为(我之前正在做的):

return JavaObject.callMethod<jint>("openAccessory", "(V)I");

我的程序烧毁并严重崩溃。为什么是这样?我是否依赖某种扭曲的 UB 来实现这一点。

【问题讨论】:

    标签: java android c++ qt android-ndk


    【解决方案1】:
     int AOAConnection::Close () {
        JNIEnvironmentAttacher jea(&this->JNIE);
        return JavaObject.callMethod<jint>("closeAccessory", "(V)I");
    }
    

    所以这段代码运行良好

    你很幸运它做到了:closeAccessory 没有参数,但你提到它确实有一个 ((V)I) 并且没有指定它。所以,是的,我敢打赌你在这里遇到了一些未定义的行为,然后如果你用不同的函数调用重复同样的错误,你就会崩溃,这并不奇怪(即使可能很难解释为什么详细)......

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      相关资源
      最近更新 更多