主要流程參考官網教程:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android#building-in-android-studio-using-the-tensorflow-aar-from-jcenter
需要注意的問題是android Ndk的路徑配置,官網的描述如下,有點過于簡潔。
用大白話說就是,到源碼目錄下,執行"./configure"指令,進而運作“configure.sh”。這個腳本涉及很多環境的配置,經過測試确認,除了android ndk的配置選擇Yes,其他配置項選擇預設路徑和No即可。需要注意的是,如果ndk安裝的時候,沒有按照預設的路徑安裝,這裡一定要手動輸入實際的路徑以保證指向正确。
配置好ndk路徑後,使用以下指令建構tensorflow demo。
bazel build --cxxopt='--std=c++11' -c opt //tensorflow/examples/android:tensorflow_demo
這個過程中,遇到一個很有意思的錯誤,如下
ERROR: /home/hhc/.cache/bazel/_bazel_hhc/d4e52c148dcdc3ca10bd6768ef14ba79/external/com_google_absl/absl/base/BUILD.bazel:29:1: C++ compilation of rule '@com_google_absl//absl/base:spinlock_wait' failed (Exit 1)
In file included from external/com_google_absl/absl/base/internal/spinlock_wait.cc:27:
In file included from external/com_google_absl/absl/base/internal/spinlock_linux.inc:17:
external/androidndk/ndk/platforms/android-14/arch-arm/usr/include/linux/futex.h:28:21: error: field has incomplete type 'struct robust_list'
struct robust_list __user *next;
^
external/androidndk/ndk/platforms/android-14/arch-arm/usr/include/linux/futex.h:27:8: note: definition of 'robust_list' is not complete until the closing '}'
struct robust_list {
^
external/androidndk/ndk/platforms/android-14/arch-arm/usr/include/linux/futex.h:28:27: error: expected ';' at end of declaration list
struct robust_list __user *next;
^
external/androidndk/ndk/platforms/android-14/arch-arm/usr/include/linux/futex.h:37:27: error: expected ';' at end of declaration list
struct robust_list __user *list_op_pending;
^
3 errors generated.
根據報錯資訊的路徑,找到“futex.h”檔案後,其出錯的代碼如下
struct robust_list {
struct robust_list __user *next;
};
struct robust_list_head {
struct robust_list list;
long futex_offset;
struct robust_list __user *list_op_pending;
};
其中兩行中的“__user”編譯器不認識,這個符号是個宏,用途大概是linux編譯器用來配置設定變量空間的标志。不知道由于什麼原因,這個宏沒有定義,是以報錯了。根據檔案開始處的注釋,我們可以知道,這個.h是調用linux相關庫函數時用到的聲明檔案,從文法上來說,直接删除這兩個“__user”編譯器就不會報錯了。也可以謹慎一點,在這裡增加下列宏,使得當沒有外部定義時,這個符号定義為空。
#ifndef __user
#define __user
#endif
修改完成,靜靜等待一段時間,ok,編譯順利通過。