編譯OpenVX的Android版本, 記錄以下, 免得下次做重複工作
阿新 • • 發佈:2019-02-05
0: 下載最新NDK版本android-ndk-r16b-linux-x86_64, 解壓,設定NDK環境變數 ANDROID_NDK
1: 生成獨立交叉編譯工具鏈,切換到NDK目錄下,執行
./build/tools/make_standalone_toolchain.py --arch=arm64 --api=26 --install-dir=../android_ndk_toolchain_root
2: 使用CMake編譯openvx_sample原始碼
1: 設定環境變數 ANDROID_NDK_TOOLCHAIN_ROOT 為 android_ndk_toolchain_root 所在的位置
2: 修正OpenVX原始碼目錄\cmake_utils\CMake_android_tools.cmake
if (BUILD_X64)
set( ANDROID_TOOLCHAIN_DIR_NAME "android-toolchain-aarch64" )
set( ANDROID_TOOLS_PREFIX "aarch64" )
#set( ANDROID_TOOLCHAIN_DIR_NAME "android-toolchain-x86_64" )
#set( ANDROID_TOOLS_PREFIX "x86_64" )
else (BUILD_X64)
set(CMAKE_FIND_ROOT_PATH "${ANDROID_NDK_TOOLCHAIN_ROOT}/bin" "${ANDROID_NDK_TOOLCHAIN_ROOT}/${ANDROID_TOOLS_PREFIX}-linux-android" "${ANDROID_NDK_TOOLCHAIN_ROOT}/sysroot" )
if(BUILD_X64)
#set(ARCH_BIT -m64 )
set(ARCH_BIT "-march=armv8-a" )
else()
3: 到OpenVX原始碼目錄下,執行 python ./Build.py --os=Android --arch=64 --conf=Debug
3: 編譯conformance_test的程式碼
#Set Android ABI
export ANDROID_ABI=arm64-v8a
#Change directory
cd conformance_tests/android
#Build conformace test binaries:
export OPENVX_DIR=$curr_path/install/$os_type/x$arch_type/$conf_type
ndk-build OPENVX_INCLUDES=${OPENVX_DIR}/include/ OPENVX_LIBRARIES="-L ${OPENVX_DIR}/lib/ -lopenvx -lvxu" APP_ABI=${ANDROID_ABI}
4: 手機檔案系統改成可讀寫
adb root
adb remount
5: 將vx_conformance_test可執行程式推送到手機上
#Deploy files on device and run conformance test.
# Upload test executable to device
adb push `pwd`/libs/${ANDROID_ABI}/vx_test_conformance /data/local/tmp/openvx/
adb shell chmod 777 /data/local/tmp/openvx/vx_test_conformance
# Upload shared libraries to device (OPTIONAL step, refer to OpenVX implementation documentation)
(cd ${OPENVX_DIR}/lib; find ./ -name '*.so' -exec adb push {} /data/local/tmp/openvx/lib/{} \;)
# Upload test data to device
(cd ../test_data; find ./ -exec adb push {} /data/local/tmp/openvx/test_data/{} \;)
# Run test on device
adb shell 'export LD_LIBRARY_PATH=/data/local/tmp/openvx/lib/:${LD_LIBRARY_PATH}; export VX_TEST_DATA_PATH=/data/local/tmp/openvx/test_data/; /data/local/tmp/openvx/vx_test_conformance'
1: 生成獨立交叉編譯工具鏈,切換到NDK目錄下,執行
./build/tools/make_standalone_toolchain.py --arch=arm64 --api=26 --install-dir=../android_ndk_toolchain_root
2: 使用CMake編譯openvx_sample原始碼
1: 設定環境變數 ANDROID_NDK_TOOLCHAIN_ROOT 為 android_ndk_toolchain_root 所在的位置
2: 修正OpenVX原始碼目錄\cmake_utils\CMake_android_tools.cmake
if (BUILD_X64)
set( ANDROID_TOOLCHAIN_DIR_NAME "android-toolchain-aarch64" )
set( ANDROID_TOOLS_PREFIX "aarch64" )
#set( ANDROID_TOOLCHAIN_DIR_NAME "android-toolchain-x86_64" )
#set( ANDROID_TOOLS_PREFIX "x86_64" )
else (BUILD_X64)
set(CMAKE_FIND_ROOT_PATH "${ANDROID_NDK_TOOLCHAIN_ROOT}/bin" "${ANDROID_NDK_TOOLCHAIN_ROOT}/${ANDROID_TOOLS_PREFIX}-linux-android" "${ANDROID_NDK_TOOLCHAIN_ROOT}/sysroot" )
if(BUILD_X64)
#set(ARCH_BIT -m64 )
set(ARCH_BIT "-march=armv8-a" )
else()
3: 到OpenVX原始碼目錄下,執行 python ./Build.py --os=Android --arch=64 --conf=Debug
3: 編譯conformance_test的程式碼
#Set Android ABI
export ANDROID_ABI=arm64-v8a
#Change directory
cd conformance_tests/android
#Build conformace test binaries:
export OPENVX_DIR=$curr_path/install/$os_type/x$arch_type/$conf_type
ndk-build OPENVX_INCLUDES=${OPENVX_DIR}/include/ OPENVX_LIBRARIES="-L ${OPENVX_DIR}/lib/ -lopenvx -lvxu" APP_ABI=${ANDROID_ABI}
4: 手機檔案系統改成可讀寫
adb root
adb remount
5: 將vx_conformance_test可執行程式推送到手機上
#Deploy files on device and run conformance test.
# Upload test executable to device
adb push `pwd`/libs/${ANDROID_ABI}/vx_test_conformance /data/local/tmp/openvx/
adb shell chmod 777 /data/local/tmp/openvx/vx_test_conformance
# Upload shared libraries to device (OPTIONAL step, refer to OpenVX implementation documentation)
(cd ${OPENVX_DIR}/lib; find ./ -name '*.so' -exec adb push {} /data/local/tmp/openvx/lib/{} \;)
# Upload test data to device
(cd ../test_data; find ./ -exec adb push {} /data/local/tmp/openvx/test_data/{} \;)
# Run test on device
adb shell 'export LD_LIBRARY_PATH=/data/local/tmp/openvx/lib/:${LD_LIBRARY_PATH}; export VX_TEST_DATA_PATH=/data/local/tmp/openvx/test_data/; /data/local/tmp/openvx/vx_test_conformance'
附錄1: OpenVX的編譯指令碼
#!/bin/sh ####################################public define begin###################################### #conf_type=Release conf_type=Debug os_type=Android #arch_type=32 arch_type=$(getconf LONG_BIT) echo $arch_type curr_path=$(cd `dirname $0`; pwd) echo $curr_path ####################################public define end######################################## export ANDROID_NDK_TOOLCHAIN_ROOT=/home/mcw/Workspace/android/android_ndk_toolchain_root/ ###################################build openvx_sample begin################################# cd $curr_path python ./Build.py --os=$os_type --arch=$arch_type --conf=$conf_type cp ./raw/*.* ./install/$os_type/x$arch_type/$conf_type/bin cd ./install/$os_type/x$arch_type/$conf_type/ mkdir -p lib cp ./bin/*.so ./lib cd ../../../../ ###################################build open_sample end#################################### ##################################build conformance_tests begin############################# #Set Android ABI export ANDROID_ABI=arm64-v8a #Change directory cd conformance_tests/android #Build conformace test binaries: export OPENVX_DIR=$curr_path/install/$os_type/x$arch_type/$conf_type ndk-build OPENVX_INCLUDES=${OPENVX_DIR}/include/ OPENVX_LIBRARIES="-L ${OPENVX_DIR}/lib/ -lopenvx -lvxu" APP_ABI=${ANDROID_ABI} #Deploy files on device and run conformance test. # Upload test executable to device adb push `pwd`/libs/${ANDROID_ABI}/vx_test_conformance /data/local/tmp/openvx/ adb shell chmod 777 /data/local/tmp/openvx/vx_test_conformance # Upload shared libraries to device (OPTIONAL step, refer to OpenVX implementation documentation) (cd ${OPENVX_DIR}/lib; find ./ -name '*.so' -exec adb push {} /data/local/tmp/openvx/lib/{} \;) # Upload test data to device (cd ../test_data; find ./ -exec adb push {} /data/local/tmp/openvx/test_data/{} \;) # Run test on device adb shell 'export LD_LIBRARY_PATH=/data/local/tmp/openvx/lib/:${LD_LIBRARY_PATH}; export VX_TEST_DATA_PATH=/data/local/tmp/openvx/test_data/; /data/local/tmp/openvx/vx_test_conformance' cd .. cd .. ###################################build conformance_test end###################################
附錄2 conformance_test 的 Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) CTS_VERSION_FILE := $(strip $(wildcard $(LOCAL_PATH)/../../openvx_cts_version.inc)) ifdef CTS_VERSION_FILE LOCAL_CFLAGS += -DHAVE_VERSION_INC endif FILE_LIST := $(wildcard $(LOCAL_PATH)/../../test_engine/*.c) $(wildcard $(LOCAL_PATH)/../../test_conformance/*.c) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_C_INCLUDES := $(OPENVX_INCLUDES) $(LOCAL_PATH)/../../ $(LOCAL_PATH)/../../test_conformance LOCAL_LDLIBS := $(OPENVX_LIBRARIES) -llog LOCAL_MODULE := vx_test_conformance ifeq ($(TARGET_ARCH_ABI),arm64-v8a) #LOCAL_CFLAGS += -DHAVE_NEON=1 -march=armv8-a -mfpu=neon -ftree-vectorize -ffast-math -mfloat-abi=softfp -std=c99 LOCAL_CFLAGS += -DHAVE_NEON=1 -march=armv8-a -ftree-vectorize -ffast-math -std=c99 endif ifneq ($(CT_DISABLE_TIME_SUPPORT),1) LOCAL_CFLAGS += -DCT_TEST_TIME endif $(info ${LOCAL_CFLAGS}) include $(BUILD_EXECUTABLE)
附錄3 Android c/c++ 開發工具總結
Android c/c++程式設計總結:
1: NDK的使用
ndk-build 編譯
ndk-build clean 清除二進位制
ndk-build NDK_DEBUG=1 編譯Debug版本
ndk-build NDK_DEBUG=0 編譯Release版本
ndk-build V=1 列印編譯命令
ndk-build -B 重新編譯
ndk-build NDK_APP_APPLICATION_MK=<檔案路徑> 指定Application.mk檔案位置
ndk-build -C <project路徑> 先進入<project路徑> 然後再執行ndk-build
2: Android.mk, Application.mk的編寫
APP_PLATFORM 指定android sdk版本
APP_ABI 指定指令集(armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64, all)
APP_STL 指定STL(system(default), stlport_static, stlport_shared, gnustl_static, gnustl_shared, gabi++_static, gabi++_shared, c++_static, c++_shared)
APP_OPTM 指定編譯模式(release, debug)
APP_MODULES 指定要編譯的庫有哪些, 與Android.mk中的LOCAL_MODULE變數定義保持一致
APP_CFLAGS 指定編譯選項
APP_CPPFLAGS 指定編譯選項
LOCAL_PATH: $(call my-dir) 返回當前目錄
CLEAR_VARS 清除變數, 清除(include $(CLEAR_VARS) 和 include $(BUILD_XXX)之間的LOCAL_XXX變數, LOCAL_PATH 除外
LOCAL_MODULE 生成的檔名
LOCAL_SRC_FILES 原始檔
BUILD_SHARED_LIBRARY 動態庫編譯
PREBUILT_SHARED_LIBRARY 引用動態庫(不用暴露原始碼)
TARGET_ARCH_ABI 設定指令集
LOCAL_LDLIBS 額外連結庫, 所有的庫都有-l字首, 多個庫用空格隔開(系統庫不用顯示新增)
LOCAL_CFLAGS, LOCAL_CPPFLAGS, LOCAL_LDFLAGS 編譯,連結標誌,傳遞給編譯器
LOCAL_CPPFLAGS += -fexceptions 開啟C++異常控制
LOCAL_CPPFLAGS += -frtti 開始RTTI
LOCAL_CFLAGS += -fvisibility=hidden 不匯出不必要的函式,縮小so體積
LOCAL_LDFLAGS += -fPIC 編譯位置無關程式碼
LOCAL_LDFLAGS += -Wall 顯示在編譯連結過程中顯示警告資訊
include $(call all-subdir-makefiles) 呼叫子目錄的Android.mk
3: CMake的設定
1:add_definitions( -D_XOPEN_SOURCE=700 -D_GNU_SOURCE=1 ) D_GNU_SOURCE:符合GNU規範, 支援POSIX, D_XOPEN_SOURCE: 支援glibc中相關功能
2:target_link_libraries(${target} PUBLIC dl m log), list( APPEND LINK_ADDITIONAL log ): 連結一些庫
3:編譯器設定成NDK中的編譯器
4: code注意事項
1: #include <android/log.h>, 用 __android_log_vprint 代替 vprintf
2: 其它同Linux
5: adb的使用
adb start-server 啟動adb服務
adb kill-server 終止adb服務
adb shell 進入adb執行環境
adb root 以root許可權重啟adb
adb remount 將system分割槽重新掛在為可讀寫分割槽
adb install xxx.apk 安裝apk
adb uninstall xxx.apk 解除安裝apk
adb shell dumpsys package xxx.apk 看看apk資訊
adb shell pm path xxx.apk 檢視apk路徑
adb shell dumpsys package xxx.apk | grep version 檢視版本
adb shell ps xxx.apk 檢視程序
adb shell kill pidnumber 殺死程序
adb shell dumpsys meminfo xxx.apk 檢視app記憶體佔用
附錄4: so 除錯方法
http://blog.csdn.net/fengvmu/article/details/46841453
準備工作:
1、找到 gdbserver 並 傳送到手機裡,gdbserver 的位置一般在NDK 目錄下的 prebuilt 資料夾內,prebuilt 資料夾內包含各種CPU下的檔案,手機一般是ARM,只需要把 android-arm 目錄裡面的 gdbserver 目錄裡面的gdbserver 這個檔案push 到 手機裡面就可以。從命令列中進入 gdbserver檔案所在的目錄,輸入"adb push gdbserver /data/local/tmp"把該檔案傳送到手機裡面。
2、找到gdb。該檔案一般位於NDK目錄下的 toolchains 資料夾下,尋找對應cpu的資料夾,一般選擇 arm-linux-androideabi-x.x ,進入此資料夾後,在其 "prebuilt\windows\bin"子目錄中可以看到以 "arm-linux-androideabi-XXX"開頭的可執行檔案,其中我們要找的檔案為"arm-linux-androideabi-gdb.exe"。可以把他名稱改為 "gdb.exe" ,然後在系統環境變數中加入該檔案的路徑,以便於以後可以直接通過命令列呼叫gdb。
需要注意的一點是:gdb 跟gdbserver的版本最好保持一致。
檢視gdb跟gdbserver版本的方法:
以下是我使用的版本,
然後進入除錯:
1、修改gdbserver的屬性,使其可以執行。"adb shell" --> "su" ,最好是使用root 許可權。然後進入到gdbserver目錄下,"cd /data/local/tmp" ,然後 "chmod 777 gdbserver"。只用修改一次即可。可以使用 "ls -l" 檢視當前目錄下的檔案屬性,確保 gdbserver 具執行的屬性。
2、使用 "gdbserver :23946 --attach xxPID"。注意,gdbserver 跟 ":23946"之間有一個空格,其中 "xxPID" 是要進行除錯的程序的PID。
3、使用 "adb forward tcp:23946 tcp:23946"進行轉發。
4、另起一個命令列,啟動gdb。啟動gdb後輸入 "target remote 127.0.0.1: 23946"。便可進行除錯