构建 SmartCamera 项目提示找不到 libgnustl_shared.so 这个包.

根据官方 issue 中作者的回答: https://github.com/pqpo/SmartCamera/issues/7#issuecomment-422299389

arguments '-DANDROID_STL=gnustl_shared' 这句注释掉后重新构建又报了这个错误

SIMPLE: Error configuring

没啥具体的信息, 很难判断, 于是我去官方 issue 提问(这是我的提问). 这几天过年没人回答我, 后来我估计是我用的 NDK 版本不同的原因, 因为下载的是最新的 r19 版本. 不过我暂时不打算降级, 而是准备解决下这个问题.


PS: 2019年4月24日 更新, 还是降级到r17c版本吧. 脸好疼

到这个链接下载 r17c 版本: https://developer.android.com/ndk/downloads/older_releases.html

解压到 SDK 目录: C:\android\sdk\ (替换成你的 sdk 路径.)

在项目中, 使用快捷键: Ctrl + Shift + Alt + S 打开 Project Structure 在界面上的 Android NDK Location 下设置 r17c 版本的目录, 接着 apply 确定并关闭窗口.


通过搜索问题, 得到了下面两个答案:

  1. https://stackoverflow.com/a/46498899/8920453
  2. https://segmentfault.com/q/1010000017958470

第一个是说通过下面这个命令可以在终端中得到报错的详细信息.

gradlew build --stacktrace

(其实在该问题页面的第三个回答已经点出我的问题所在: https://stackoverflow.com/a/54138701/8920453)

于是我在打开了 SmartCamera 项目的 Android StudioTerminal 控制台中输入上面的命令构建. 结果又报了

cmake cannot find the build tool "ninja"

这个错误在上面的第二个答案也可以得到验证.

于是, 开始安装 ninja 这个包.
参考两个链接:

  1. https://blog.csdn.net/darren2015zdc/article/details/74504917
  2. https://github.com/ninja-build/ninja/blob/master/HACKING.md (官方英文)

下面是我的执行步骤:

  1. 打开命令行窗口
  2. cd 进入 workspace (Android 项目工作目录) 使用下面两个命令把 ninja 项目从 github 上拉下来.

    git clone git://github.com/ninja-build/ninja.git && cd ninja
    git checkout release
    
  3. 接着点击开始菜单搜索 VS2015 x86 x64 兼容工具命令提示符 然后右键 以管理员身份运行

  4. 使用下面的两个命令配置 ninja, 第二个命令需要先 cd 到 workspace 里的 ninja 项目目录中去执行

    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
    python configure.py --bootstrap
    
  5. 配置好用下面这个命令测试下是否正常.

    ninja --help
    
  6. 没问题的话就把 ninja 的项目目录放到环境变量 PATH 中.

装完后发现换了另外一个异常了.

Build command failed.
...
/operations.hpp:74:16: fatal error: 'ext/atomicity.h' file not found
#include <ext/atomicity.h>
           ^~~~~~~~~~~~~~~~~
1 error generated.

通过搜索, 又换了另一个参数, 参考: https://blog.csdn.net/luozhuang/article/details/36418229

arguments '-DANDROID_STL=gnustl_static'

使用上面这个参数, 不要 build , 直接 run 项目到测试机上, 总算不再报错了. 不过此时出现了另一个异常, 如下图(这是我自己项目中的, 官方Demo也有同样的问题, 是兼容问题, 出现的机子品牌是魅族, Nexus 没有这问题).

排查了下发现原来是因为这个Activity要全屏展示扫描窗口, 所以在 onCreate 里加了下面使全屏的代码, 才导致了奇怪的问题.

// 去除状态栏  
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

而且哪怕修改为使用 xml 文件里改 theme 的方式设置全屏也会导致同样的问题.
之后我用延时的方式设置就正常了.

new Handler().postDelayed(new Runnable() {  
    @Override
    public void run() {
        // 去除状态栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
}, 1000);