Android NDK __android_log_print在自定义线程内无法输出日志问题
问题排查与解决办法
- Logcat线程过滤限制
Android Studio默认Logcat过滤器仅展示当前应用主线程/渲染线程的日志,你自行创建的逻辑线程日志会被默认隐藏。
排查方式:将Logcat过滤器切换为No Filters,或在自定义过滤器中仅绑定你的日志TAG、不限制线程,即可看到子线程输出的日志。 - 厂商系统日志拦截
小米、华为等国产ROM默认会拦截优先级低于INFO的Debug/Verbose级别日志,如果你__android_log_print使用的优先级是ANDROID_LOG_DEBUG或ANDROID_LOG_VERBOSE,可能出现子线程日志被随机拦截的情况。
解决方式:将日志优先级调整为ANDROID_LOG_INFO及以上,或在设备开发者选项中开启允许Debug日志输出的开关。 - 子线程JNI绑定异常(可选排查)
若你的Native日志逻辑存在间接通过JNI调用Java层日志接口的操作,自定义线程需要先绑定JVM才能正常调用JNI接口。你可以在逻辑线程Native执行逻辑前补充JNI绑定逻辑:
Engine.logicThread = new Thread(new Runnable() { @Override public void run() { // 若Native层需要JNI操作,先绑定JVM,可在Native层内部实现Attach逻辑 while(Engine.isRunning) { Engine.NativeUpdate(); try{ Thread.sleep(16); } catch(InterruptedException e) { e.printStackTrace();} } } });
注:原生
__android_log_print本身是线程安全的,不需要额外适配多线程环境,你确认无线程局部存储的情况下,90%以上的概率是前两个配置问题导致的日志不显示。
内容的提问来源于stack exchange,提问作者Hipreme
相关产品推荐
相关产品推荐

