在MediaPipe框架解析(一):bazel构建中我们在安装完bazel之后在执行“Hello World! in C++ example”的时候报错,所以只简单执行了bazel提供的example,但我们了解bazel只是为了学习mediapipe框架,所以本章还是会继续编译执行mediapipe的helloworld。由于本人技术栈较偏向于安卓,所以后续可能都会默认侧重安卓的角度来理解该框架。
zutils.h中fdopen重定义问题
在MediaPipe框架解析(一):bazel构建中我们在安装完bazel之后在执行“Hello World! in C++ example”的时候报了类似如下图所示的一些错误。
从错误信息可知为fdopen和OS_CODE的重定义,尝试如下修改后可以修复问题。
编译“Hello World! in C++ example”
- 首先cd到mediapipe的根目录下
- 执行命令“bazel run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world:hello_world”
- 待执行完后会生成可执行文件bazel-bin/mediapipe/examples/desktop/hello_world/hello_world
编译安卓的helloworld
安卓的helloworld代码位于mediapipe/examples/android/src/java/com/google/mediapipe/apps/basic
可以看到该位置存在一个BUILD文件,其中指定了名为helloworld的android_binary编译规则,具体项目细节我们会在下一章分析,本章先简单运行该helloworld。
- 由于WORKSPACE等文件都位于mediapipe的根目录,所以我们要想编译安卓的helloworld,还是要先cd到mediapipe根目录.
- 安卓工程相较于“Hello World! in C++ example”会多一步设置android sdk和ndk的步骤,如下图所示,需要将本地已经存在的安卓sdk路径和ndk路径等信息添加到WORKSPACE文件末尾(若无sdk以及ndk可直接执行mediapipe/setup_android_sdk_and_ndk.sh)
- 执行bazel命令构建该helloworld,首次编译会花费较长时间来获取安卓相关的一些依赖,这一点和gradle流程也较相似。
- 执行成功后会生成helloworld.apk在如下路径,可以执行adb安装即可
- helloworld安装在手机上后效果如下,是一个边缘检测的应用,下一章会重点解析mediapipe是如何实现这一流程的