1. 程式人生 > >編譯OpenVX的Android版本, 記錄以下, 免得下次做重複工作

編譯OpenVX的Android版本, 記錄以下, 免得下次做重複工作

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: 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"。便可進行除錯