[英]Android - JNI crash on set Native C++ Variable
当我尝试在 C++ 类中设置变量时,我有一些 JNI/C++ 代码崩溃。
void AndroidReflectionViewer::NativeSetVrActive(JNIEnv* env, jboolean active) {
LOGW("This gets called fine");
other_obj_.set_vr_enabled(active);
LOGW("Code never gets to here");
}
反过来other_obj_
函数看起来像:
void set_vr_enabled(bool enabled) {
LOGW("Before bool set prints fine.");
what_eva = enabled;
LOGW("After never prints");
}
当我将other_obj_
的bool
设置为任何值(或真正更改该对象中的任何变量)时,它似乎会崩溃。 不过打印日志语句很好。 我也试过what_eva = true
,没有区别。
? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x123e in tid 12243
[ 01-19 09:18:54.062 457: 457 W/ ]
debuggerd: handling request: pid=12243 uid=10143 gid=10143 tid=12243
I/nanohub: osLog: [BMI160] gyrPower: on=1, state=3
I/nanohub: osLog: [BMI160] magPower: on=1, state=4
? W/debuggerd: type=1400 audit(0.0:1870): avc: denied { search } for name="com.foo" dev="sda35" ino=877326 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
? W/debuggerd: type=1400 audit(0.0:1871): avc: denied { search } for name="com.foo" dev="sda35" ino=877326 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
我阅读了 avc: denied errors on Android source 。 虽然这些有助于调试错误的来源,但它并没有就实际可能导致的原因提供很多建议。 所以对于实际问题:
什么可能导致此崩溃,我该如何解决?
有几件事似乎可能导致此问题:
也许我没有在正确的线程中。 我试过等待那个线程,但没有用。
也许 jboolean 是一个问题? 转换并仅设置what_eva = true
不起作用。
也许这是一种竞争条件,即在初始化 C++ 代码之前运行 Java 代码。
实际解决方案:
崩溃是由竞争条件引起的,我试图在 C++ 初始化之前从 Java 调用 C++ 函数。 我在调用 C++ 之前延迟了几毫秒,它可以工作。 这似乎不是超级强大,但在这种情况下,我计划无论如何都从用户激活的按钮调用它。 当我这样做时,我不应该担心比赛条件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.