在android端通过C++调用tflite,不直接通过java调用,这时需要通过编译tensorflow的源码编译生成tflite的so库,下面介绍编译的详细过程
1.下载tensorflow源码
git clone https://github.com/tensorflow/tensorflow.git
注意版本,为了与模型使用的代码相匹配,我使用的是tensorflow=r1.13
进入tensorflow-r1.13目录,进行configure,在命令行运行:
./configure
由于这一步相关的配置较多,不知道含义的都直接使用默认的选项,直接回车键即可,但是python的路径必须要指定
配置完毕后,你还需要在该目录下的WORKSPACE文件中添加ndk的环境,直接在文件的末尾加入如下参数即可,
android_ndk_repository(
name = "androidndk", # Required. Name *must* be "androidndk".
api_level = 23,
)
2. 下载NDK
从google官网下载相应的版本NDK,我下载的是linux版本的ndk-r14b ,下载完后设置ndk环境变量:
export ANDROID_NDK_HOME='/data/xxx/tensorflow-r1.13/android-ndk-r14b'
3. 安装bazel
可参考:https://docs.bazel.build/versions/master/install-ubuntu.html
通过下面命令下载,安装bazel
wget bazel-0.21.0-installer-linux-x86_64.sh
chmod +x bazel-0.21.0-installer-linux-x86_64.sh
./bazel-0.21.0-installer-linux-x86_64.sh --user
如果这个过程没有报错,就说明安装成功
4. 编译tflite库
修改tensorflow/lite/BUILD的内容,在该文件的最后加上以下内容:
cc_binary(
name = "libtensorflowLite.so",
linkopts=["-shared", "-W"],
linkshared=1,
copts = tflite_copts(),
deps = [
":framework",
"//tensorflow/lite/kernels:builtin_ops",
],
)
接下来进行编译,编译命令如下:
bazel build -c opt --crosstool_top=//external:android/crosstool
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain --cxxopt="-std=c++11"
--fat_apk_cpu=armeabi-v7a --config=android_arm
--linkopt='s'
//tensorflow/lite:libtensorflowLite.so
bazel对编译、链接的参数进行控制可参考:https://docs.bazel.build/versions/master/user-manual.html,比如链接时可通过参数--linkopt进行控制
注意: tensorflow/lite/BUILD中的name要和编译命令中的so库名(libtensorflowLite.so)一致
最后,提示successfully表示编译成功
编译好的模型libtensorflowlite.so会保存在/tensorflow/bazel-bin/tensorflow/lite文件夹中,下面我们开始配置依赖环境,进行C++业务代码的编写。