2017-05-25 22 views
5

我想在C++的Android上運行神經網絡。這些示例(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/androidhttps://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android)顯示瞭如何使用使用JNI函數調用C++的JAVA API的tensorflow。有沒有人試圖直接在Android上使用C++進行tensorflow?張量流庫如何構建和鏈接以在Android上使用C++ API。你能指導我嗎?我想以類似於iOS示例中的方式在Android上使用C++ apis。直接在Android NDK端使用tensorflow(不使用JAVA API)

回答

0

100%的可能,用小的警告......

大多數Android的用戶界面是用Java實現。您可以創建一個native activity,但要獲得任何輸出到屏幕上,您需要使用OpenGL(它沒有所有漂亮的Android UI視圖),或者您需要轉換JNI屏障以將您的數據輸出顯示給用戶的本機代碼。

取決於您對OpenGLES,EGL等的熟悉程度。您可以選擇轉換JNI屏障,而不是創建native_activity,但是截面要小得多。

您可以創建一個Runnable並在需要執行工作時發出信號。使用併發隊列(以Java)提交工作,並使用另一個(併發)隊列從中接收結果。 Runnable彈出工作隊列,調用單個JNI/C函數來提交工作並返回JSON字符串。然後它將工作提交到完成的隊列。

+0

如果我的問題不清楚,我很抱歉。我根本不關心UI部分。我將通過JNI傳遞數據來處理。 我的問題是關於如何爲android構建tensorflow並將其包含在android項目中,以在Android應用程序的C++端調用tensorflow apis。我在C++端有圖像緩衝區,我想通過神經網絡運行而不發送給JAVA。 –

2

這是我如何解決這個問題。儘管在android上使用C++ apis的文檔並不多,並且編譯和鏈接tensorflow到NDK,但makefile還有重要的註釋以及相關的腳本。編譯步驟與ios非常相似。

  1. 安裝以下依賴性的)的autoconf b)中的automake c)中的automake。然後運行tensorflow/contrib/makefile/download_dependencies.sh;我運行在2017年5月10日,第一次,當它完美的工作。在6月1日左右的更新版本中,由於tensorflow/workspace.bzl中的某些更改,我在download_dependencies.sh中無法識別download_dependencies正在嘗試下載的tar文件。我剛剛從5月10日更換了workspace.bzl。
  2. 步驟2是運行tensorflow /了contrib /生成文件/ compile_android_protobuf.sh這樣

    NDK_ROOT =絕對/路徑/到/ NDK /文件夾./tensorflow/contrib/makefile/compile_android_protobuf.sh

  3. 運行make。但首先您可能需要對Makefile進行一些更改。用-fPIC標誌替換-fPIE標誌。同時向HOST_CXXFLAGS添加-fPIC標誌。然後運行使這樣的:

    化妝-f tensorflow /了contrib /生成文件/生成文件TARGET =機器人NDK_ROOT =絕對/路徑/到/ NDK /文件夾

    或者,可以還運行build_all_android.sh它運行所有3一步到位,但您可能需要對標誌進行Makefile更改。

這個生成tensorflow /了contrib /生成文件/根/ protobuf的/ LIB/libprotobuf.a和tensorflow /了contrib /生成文件/根/ LIB/libtensorflow-core.a;這可以鏈接到LOCAL_LDLIBS下的Android.mk文件中的Android NDK項目。應該在Android.mk文件的LOCAL_CFLAGS中使用這些鏈接標誌-Wl,--build-id -Wl,--allow-multiple-definition -Wl,--whole-archive -std = C++ 11,並在Application.mk文件中使用APP_STL:= gnustl_shared。

這應該足以構建NDK項目的共享庫。

+0

任何想法如何使用CMake在新的Android中完成這項工作?我已經嘗試了一堆東西,但一直未能使用Android NDK C++代碼使用C++ tensorflow調用。 –