我有以下java函数在附件模式下打开USB端口。
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来实现这一目标。
答案 0 :(得分:1)
int AOAConnection::Close () {
JNIEnvironmentAttacher jea(&this->JNIE);
return JavaObject.callMethod<jint>("closeAccessory", "(V)I");
}
所以这段代码工作正常
你很幸运:因为closeAccessory
没有采用参数,但你提到它确实得到了一个((V)I
)并且没有指定它。所以,是的,我打赌你在这里得到一些未定义的行为然后它并不奇怪(即使可能很难解释为什么详细)如果你用不同的函数调用重复相同的错误你会崩溃... < / p>