我目前正在研究一个关于神经网络的项目.为此,我想构建一个Android应用程序,它应该使用tensorflow [lite]来解决一些对象检测/识别问题.
因为我希望代码尽可能地可移植,所以我想用C++编写大部分代码,因此使用tensorflow lite的C++ API而不是Java API/wrapper.因此,我修改了tensorflow/contrib/lite/BUILD并添加了以下内容以便能够创建共享张量流库.
cc_binary(
name = "libtensorflowLite.so",
linkopts=["-shared", "-Wl"],
linkshared=1,
copts = tflite_copts(),
deps = [
":framework",
"//tensorflow/contrib/lite/kernels:builtin_ops",
],
)
Run Code Online (Sandbox Code Playgroud)
(这是基于解决这个问题的:https://github.com/tensorflow/tensorflow/issues/17826)
然后我用了
bazel build //tensorflow/contrib/lite:libtensorflowLite.so --crosstool_top=//external:android/crosstool --cpu=arm64-v8a --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --cxxopt="-std=c++11"
Run Code Online (Sandbox Code Playgroud)
最终建立它.
之后我转向Android Studio并设置了一个基本项目.为了将共享库添加到项目中,我参考了这个示例:
我还为flatbuffers添加了所需的依赖项.
构建/编译过程成功,没有任何链接器错误(好吧,至少在尝试了几个小时之后......).
然后APK成功安装在Android设备上,但在启动后立即崩溃.Logcat提供以下输出:
04-14 20:09:59.084 9623-9623/com.example.hellolibs E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hellolibs, PID: 9623
java.lang.UnsatisfiedLinkError: dlopen failed: library "/home/User/tensorflowtest/app/src/main/cpp/../../../../distribution/tensorflow/lib/x86/libtensorflowLite.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
at java.lang.System.loadLibrary(System.java:1657)
at com.example.hellolibs.MainActivity.<clinit>(MainActivity.java:36)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at …Run Code Online (Sandbox Code Playgroud)