直接在Android NDK端使用tensorflow(不使用JAVA api)

Rup*_*aya 10 c++ android android-ndk tensorflow

我试图在Android上用C++运行神经网络.示例(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android)显示如何使用tensorflow使用JAVA apis,它使用JNI函数调用C++.有人试图在Android上直接在C++中使用tensorflow吗?如何在Android上使用C++ apis构建和链接tensorflow库.你能指导我吗?我想在Android上以类似于iOS示例的方式使用C++ apis.

Rup*_*aya 5

这是我解决此问题的方法。尽管没有太多关于在an​​droid上使用c ++ api以及将tensorflow编译并链接到NDK的文档,但是makefile具有重要的注释以及相关的脚本。编译步骤与ios非常相似。

  1. 安装以下依赖项a)autoconf b)automake c)automake。然后运行tensorflow / contrib / makefile / download_dependencies.sh; 当它运行良好时,我第一次运行于2017年5月10日存储库。在6月1日前后的更高版本中,由于tensorflow / workspace.bzl中的某些更改,我在download_dependencies.sh中无法理解,无法识别tar文件download_dependencies正在尝试下载。我只是从5月10日回购提交中替换了workspace.bzl。
  2. 第2步是这样运行tensorflow / contrib / makefile / compile_android_protobuf.sh

    NDK_ROOT =绝对/路径/到/ ndk /文件夹./tensorflow/contrib/makefile/compile_android_protobuf.sh

  3. 运行make。但是首先,您可能需要在Makefile中进行一些更改。用-fPIC标志替换-fPIE标志。还要将-fPIC标志添加到HOST_CXXFLAGS。然后像这样运行make:

    make -f tensorflow / contrib / makefile / Makefile TARGET = ANDROID NDK_ROOT =绝对/路径/到/ ndk /文件夹

    另外,也可以一次运行build_all_android.sh,它一次执行所有3个步骤,但是您可能需要对标记进行Makefile更改。

这生成了tensorflow / contrib / makefile / gen / protobuf / lib / libprotobuf.a和tensorflow / contrib / makefile / gen / lib / libtensorflow-core.a; 这可以链接到LOCAL_LDLIBS下的Android.mk文件中的Android NDK项目。应该-Wl,--build-id -Wl,--allow-multiple-definition -Wl,--whole-archive在Android.mk文件中的LOCAL_CFLAGS中使用-std = c ++ 11,在Application.mk文件中使用APP_STL:= gnustl_shared。

这足以构建您的NDK项目的共享库。


Jam*_*oag 0

100% 可能,但有一个小警告......

Android 的大部分 UI 都是用 Java 完成的。您可以创建一个本机活动,但要将任何输出输出到屏幕,您需要使用 OpenGL(它没有所有漂亮的 Android UI 视图),或者您需要将 JNI 屏障转换为将数据输出本机代码显示给用户。

根据您对 OpenGLES、EGL 等的熟悉程度。您可能会选择转换 JNI 屏障而不是创建 native_activity,但横截面要小得多。

您可以创建一个 Runnable 并在有工作需要执行时向其发出信号。使用并发队列(在 Java 中)提交工作,并使用另一个(并发)队列接收结果。Runnable 弹出工作队列,调用单个 JNI/C 函数来提交工作并返回 JSON 字符串。然后它将工作提交到完成队列。

  • 如果我的问题不清楚,我很抱歉。我根本不关心 UI 部分。无论如何,我都会通过 JNI 传递数据来处理。我的问题是关于如何为android构建tensorflow并将其包含在android项目中以在Android应用程序的C++端调用tensorflow api。我在 C++ 端有图像缓冲区,我想通过神经网络运行它而不将其发送到 JAVA。 (2认同)