NDK移植編譯&心得&ADB/GDB簡單應用

I. 基本流程

1.設置環境變量

建議去官網下載最新版本的NDK,老版本很多宏定義缺失,比較麻煩。同時,之前用android-ndk-r10d,需要安裝32位庫環境。

yum install libstdc++-devel.i686
yum install libzip.i686 
#!/bin/bash
# environment setting
export ANDROID_NDK_PATH=/opt/android-ndk-r14b
export TOOLCHAINS_PATH=${ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
export PATH=${PATH}:${TOOLCHAINS_PATH}
export SYSROOT_PATH=${ANDROID_NDK_PATH}/platforms/android-22/arch-arm
export LIBSTD_PATH=${ANDROID_NDK_PATH}/sources/cxx-stl/gnu-libstdc++/4.9
#以下三個實際不需要
export ANT_PATH=/usr/local/Cellar/ant/1.9.6/bin
export ANDROID_SDK_HOME=/opt/AndroidSDK
export JAVA_HOME=/usr

# user setting
export USING_WEBRTC=yes
#export DEBUG=no
export CC=arm-linux-androideabi-gcc
export CXX=arm-linux-androideabi-g++
export AR=arm-linux-androideabi-ar
export CFLAGS="-DANDROID -fPIC  -std=c++11 -ffunction-sections -funwind-tables -fstack-protector  -no-canonical-prefixes -fexceptions -frtti -marm -march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon -mthumb -fno-strict-aliasing -finline-limit=64 -Wa,--noexecstack -Wformat -Werror=format-security -g -Wall --sysroot=${SYSROOT_PATH} -I${LIBSTD_PATH}/include -I${LIBSTD_PATH}/libs/armeabi/include -I${ANDROID_NDK_PATH}/sources/android/cpufeatures/"
export LDFLAGS="--sysroot=${SYSROOT_PATH} -L${LIBSTD_PATH}/libs/armeabi -lgnustl_shared -lgcc -no-canonical-prefixes -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -lstdc++ -lsupc++ -lc -lm -pthread"

只要事先運行腳本,基本能應對一般的庫(包括開源庫)的編譯。

2.修改Makefile模板,針對EXE情況做特殊處理

GCC=$(CROSS)gcc
GXX=$(CROSS)g++
AR=$(CROSS)ar

ifeq ($(CROSS),arm-linux-androideabi-)
ifdef EXE_TARGET
CFLAGS += -pie -fPIE
LDFLAGS += -pie -fPIE
endif
endif

##3.PTLIB的configure參數
注意,這裏的configure文件我做了少量修改。僅個人記錄用。

./configure --enable-exceptions --host=armv7-a-android --disable-openssl --disable-shmaudio --enable-shmvideo=no --disable-resolver --enable-serial=no --disable-v4l2

II. 心得

1.主要的頭文件目錄

/opt/android-ndk-r14b/platforms/android-22/arch-arm/usr/include
/opt/android-ndk-r14b/sources/cxx-stl/gnu-libstdc++/4.9/include

##2.編譯錯誤解決
1)部分原來是/usr/include/sys下的頭文件路徑可能有變化,直接在incude目錄下。
2)出現鏈接錯誤時,務必用arm-linux-androideabi-nm檢查下是否沒實現。存在頭文件與庫文件不一致的現象。

2.ifaddrs.h不存在

1)使用libuv庫內的 android-ifaddrs即可。部分版本可能有坑。

我自己傳的下載地址:

http://download.csdn.net/detail/gogoytgo/9882241

III. ADB使用

Linux版本的adb支持多個Shell同時開啓,比Win的版本方便許多,強烈推薦

#!/bin/bash
#連接
adb connect <ip>
#進入shell
adb shell
#如果有多個鏈路,可以這樣選擇,端口缺省5555
adb -s <ip>:<port> shell
#傳輸文件
adb push 1.txt /storage/emulated/0/
#所有動態庫需要放置在/system/lib目錄下,需要賦予/system目錄讀寫權限
mount -o remount,rw /system
#大多數命令需要busybox驅動,例如vi,ifconfig等
busybox vi 1.txt

IV.GDB使用

android下使用gdbserver和gdb配套使用。兩個版本必須一致。建議用你NDK目錄下的那一對。
整體思路和一般的ARM設備調試類似。

  1. 拷貝gdbserver到Android設備上
cd /opt/android-ndk-r14b/prebuilt/android-arm/gdbserver
adb push gdbserver /sdcard/share
  1. 在Android下啓動gdbserver

端口可以隨意調整,本文以9999爲例

#手工跑
./gdbserver 0.0.0.0:9999 ./test_program args
#附加進程
./gdbserver --attach 0.0.0.0:9999 pid
  1. 在調試機上運行gdb
    可以在Linux下也可以在Windows下運行,以Linux下運行爲例:
cd  /opt/android-ndk-r14b/prebuilt/linux-x86_64/bin
#windows下的話就是D:\android-ndk-r14b\prebuilt\windows-x86_64\bin
adb pull /system/lib/libc.so .
adb pull /system/lib/libm.so .
……
需要把所有依賴的動態庫,都放置到當前準備調試的目錄下
系統相關的動態庫也必須補齊,否則堆棧無法正確分析
……
./gdb
target remote <android設備IP>:9999
c

後面就和普通的gdb無差別了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章