NDK中默認的__ANDROID_API__ 和影響

編譯doubango時候發現經常鏈接出錯:stdin ,stdout, stderr undefine reference 這明明就是stdio中的對象,這麼基礎的咚咚它居然說找不到, 這還講不講科學?? <br/>翻查一下 my-android-toolchain-android-armv7-a/sysroot/usr/include/stdio.h 看看它是怎麼定義的:

#if __ANDROID_API__ >= __ANDROID_API_M__
extern FILE* stdin __INTRODUCED_IN(23);
extern FILE* stdout __INTRODUCED_IN(23);
extern FILE* stderr __INTRODUCED_IN(23);

/* C99 and earlier plus current C++ standards say these must be macros. */
#define stdin stdin
#define stdout stdout
#define stderr stderr
#else
/* Before M the actual symbols for stdin and friends had different names. */
extern FILE __sF[] __REMOVED_IN(23);

#define stdin (&__sF[0])
#define stdout (&__sF[1])
#define stderr (&__sF[2])
#endif

噢啊, ndk裏用__ANDROID_API__來控制不同的分支, 那它當前到底走哪個分支咧? 加個宏來故意打印當前的__ANDROID_API__取值就知道了:

#define XSTR(x) STR(x)
#define STR(x) #x
#pragma message "The value of __ANDROID_API__: " XSTR(__ANDROID_API__)

打印出來是10000, 我日?它怎麼這麼大

grep -Fnr '__ANDROID_API__' my-android-toolchain-android-armv7-a/sysroot/
看看到底在哪裏定義的, 輸出一堆堆 看的太多了, 需要過濾一下
grep -Fnr 'ifndef __ANDROID_API__' my-android-toolchain-android-armv7-a/sysroot/
過濾一下

發現是在 my-android-toolchain-android-armv7-a/sysroot/usr/include/android/api-level.h 裏定義了默認值。

#ifndef ANDROID_API_LEVEL_H
#define ANDROID_API_LEVEL_H

#include <sys/cdefs.h>

/*
 * Magic version number for a current development build, which has
 * not yet turned into an official release.
 */
#ifndef __ANDROID_API_FUTURE__
#define __ANDROID_API_FUTURE__ 10000
#endif

#ifndef __ANDROID_API__
#define __ANDROID_API__ __ANDROID_API_FUTURE__
#else
#define __ANDROID_NDK__ 1
#endif

#define __ANDROID_API_G__ 9
#define __ANDROID_API_I__ 14
#define __ANDROID_API_J__ 16
#define __ANDROID_API_J_MR1__ 17
#define __ANDROID_API_J_MR2__ 18
#define __ANDROID_API_K__ 19
#define __ANDROID_API_L__ 21
#define __ANDROID_API_L_MR1__ 22
#define __ANDROID_API_M__ 23
#define __ANDROID_API_N__ 24
#define __ANDROID_API_N_MR1__ 25
#define __ANDROID_API_O__ 26
#define __ANDROID_API_O_MR1__ 27

#endif /* ANDROID_API_LEVEL_H */

看到了吧, 默認的__ANDROID_API__就是10000, 那我就改掉默認值唄!!! 在 configura.ac 里加上 -D__ANDROID_API=23 然後 ./autogen.sh && x.sh 編譯、鏈接成功了, 呵呵呵~

                arm64)
                        export ANDROID_PREFIX=aarch64-linux-android
                        export SYSROOT=$NDK/platforms/android-23/arch-arm64
                        export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-android-arm64
                        $NDK/build/tools/make-standalone-toolchain.sh --arch=arm64 --platform=android-23 --install-dir=$ANDROID_TOOLCHAIN
                        export CFLAGS='-DANDROID=1 -D__ARMEL__ -D__ANDROID_API__=23'
                        AC_SUBST(TARGET_ARCH, "arm")
                ;;
                armv7-a)
                        export ANDROID_PREFIX=arm-linux-androideabi
                        export SYSROOT=$NDK/platforms/android-23/arch-arm
                        export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-android-armv7-a
                        $NDK/build/tools/make-standalone-toolchain.sh --platform=android-23 --arch=arm --install-dir=$ANDROID_TOOLCHAIN
                        export CFLAGS='-march=armv7-a -mfloat-abi=softfp -D__ANDROID_API__=23 -DANDROID=1 -D__ARMEL__'
                        export LDFLAGS='-Wl,--fix-cortex-a8'
                        AC_SUBST(TARGET_ARCH, "arm")
                ;;
                armv7-a-neon)
                        export ANDROID_PREFIX=arm-linux-androideabi
                        export SYSROOT=$NDK/platforms/android-23/arch-arm
                        export ANDROID_TOOLCHAIN=$(pwd)/my-android-toolchain-android-armv7-a-neon
                        $NDK/build/tools/make-standalone-toolchain.sh --platform=android-23 --arch=arm --install-dir=$ANDROID_TOOLCHAIN
                        export CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=neon -D__ANDROID_API__=23 -DANDROID=1'
                        export LDFLAGS='-Wl,--fix-cortex-a8'
                        AC_SUBST(TARGET_ARCH, "arm")
                ;;

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