<form id="dlljd"></form>
        <address id="dlljd"><address id="dlljd"><listing id="dlljd"></listing></address></address>

        <em id="dlljd"><form id="dlljd"></form></em>

          <address id="dlljd"></address>
            <noframes id="dlljd">

              聯系我們 - 廣告服務 - 聯系電話:
              您的當前位置: > 關注 > > 正文

              NDK移植編譯 android-ndk-r10dNDK基本流程

              來源:CSDN 時間:2023-03-17 10:35:54

              I. 基本流程

              1.設置環境變量


              (資料圖片)

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

              yum install libstdc++-devel.i686yum install libzip.i686

              #!/bin/bash# environment settingexport ANDROID_NDK_PATH=/opt/android-ndk-r14bexport TOOLCHAINS_PATH=${ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/binexport PATH=${PATH}:${TOOLCHAINS_PATH}export SYSROOT_PATH=${ANDROID_NDK_PATH}/platforms/android-22/arch-armexport LIBSTD_PATH=${ANDROID_NDK_PATH}/sources/cxx-stl/gnu-libstdc++/4.9export CC=arm-linux-androideabi-gccexport CXX=arm-linux-androideabi-g++export AR=arm-linux-androideabi-arexport 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"

              只要事先運行腳本,基本能應對一般的庫(包括開源庫)的編譯。 因為C編譯CFLAGS中不存在-std=c++11和-frtti,也不需要STL庫gnustl_shared和C++庫supc++ ,所以編譯純C庫的時候建議移除他們

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

              GCC=$(CROSS)gccGXX=$(CROSS)g++AR=$(CROSS)arifeq ($(CROSS),arm-linux-androideabi-)ifdef EXE_TARGETCFLAGS += -pie -fPIELDFLAGS += -pie -fPIEendifendif

              ##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即可。部分版本可能有坑。 **注意更新,libuv也迭代了幾個版本過。

              III. ADB使用

              以Linux版本的adb為例;Win的版本也可以,但是總體操作Linux下的方便很多

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

              IV.查看依賴(類似于ldd)

              使用readelf函數可以讀取動態庫或EXE的依賴,下面是示例:

              arm-linux-androideabi-readelf -d libjanus_streaming.so Dynamic section at offset 0x25bd8 contains 42 entries:  Tag        Type                         Name/Value 0x00000003 (PLTGOT)                     0x26d80 0x00000002 (PLTRELSZ)                   1256 (bytes) 0x00000017 (JMPREL)                     0x2784 0x00000014 (PLTREL)                     REL 0x00000011 (REL)                        0x22b4 0x00000012 (RELSZ)                      1232 (bytes) 0x00000013 (RELENT)                     8 (bytes) 0x6ffffffa (RELCOUNT)                   145 0x00000006 (SYMTAB)                     0x148 0x0000000b (SYMENT)                     16 (bytes) 0x00000005 (STRTAB)                     0xd88 0x0000000a (STRSZ)                      3651 (bytes) 0x00000004 (HASH)                       0x1bcc 0x00000001 (NEEDED)                     Shared library: [libcurl.so] 0x00000001 (NEEDED)                     Shared library: [libssl.so.1.1] 0x00000001 (NEEDED)                     Shared library: [libcrypto.so.1.1] 0x00000001 (NEEDED)                     Shared library: [libz.so] 0x00000001 (NEEDED)                     Shared library: [libglib-2.0.so.0] 0x00000001 (NEEDED)                     Shared library: [libpcre.so] 0x00000001 (NEEDED)                     Shared library: [libintl.so] 0x00000001 (NEEDED)                     Shared library: [libiconv.so] 0x00000001 (NEEDED)                     Shared library: [libjansson.so] 0x00000001 (NEEDED)                     Shared library: [libgnustl_shared.so] 0x00000001 (NEEDED)                     Shared library: [libstdc++.so] 0x00000001 (NEEDED)                     Shared library: [libc.so] 0x00000001 (NEEDED)                     Shared library: [libm.so] 0x00000001 (NEEDED)                     Shared library: [libdl.so] 0x0000000e (SONAME)                     Library soname: [libjanus_streaming.so.0] 0x0000001a (FINI_ARRAY)                 0x26bcc 0x0000001c (FINI_ARRAYSZ)               8 (bytes) 0x00000019 (INIT_ARRAY)                 0x26bd4 0x0000001b (INIT_ARRAYSZ)               4 (bytes) 0x0000000f (RPATH)                      Library rpath: [/opt/android-libs/lib] 0x00000010 (SYMBOLIC)                   0x0 0x0000001e (FLAGS)                      SYMBOLIC BIND_NOW 0x6ffffffb (FLAGS_1)                    Flags: NOW 0x6ffffff0 (VERSYM)                     0x20f0 0x6ffffffc (VERDEF)                     0x2278 0x6ffffffd (VERDEFNUM)                  1 0x6ffffffe (VERNEED)                    0x2294 0x6fffffff (VERNEEDNUM)                 1 0x00000000 (NULL)                       0x0

              V.GDB使用

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

              拷貝gdbserver到Android設備上

              cd /opt/android-ndk-r14b/prebuilt/android-arm/gdbserveradb push gdbserver /sdcard/share

              在Android下啟動gdbserver

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

              #手工跑./gdbserver 0.0.0.0:9999 ./test_program args#附加進程./gdbserver --attach 0.0.0.0:9999 pid

              在調試機上運行gdb 可以在Linux下也可以在Windows下運行,以Linux下運行為例:

              cd  /opt/android-ndk-r14b/prebuilt/linux-x86_64/bin#windows下的話就是D:\android-ndk-r14b\prebuilt\windows-x86_64\binadb pull /system/lib/libc.so .adb pull /system/lib/libm.so .……需要把所有依賴的動態庫,都放置到當前準備調試的目錄下系統相關的動態庫也必須補齊,否則堆棧無法正確分析……./gdbtarget remote:9999c

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

              責任編輯:

              標簽:

              相關推薦:

              精彩放送:

              新聞聚焦
              Top 中文字幕在线观看亚洲日韩