如何使用crystax-NDK& amp;交叉编译gperftools for android自动工具?

时间:2015-09-17 10:24:29

标签: android android-ndk autotools

我的最终目标是能够使用gperftools在Android环境中配置本机代码(C ++)。

我的环境/工具:

  • ubuntu 14.04
  • crystax-NDK-10.2.1
  • GCC-4.8.4
  • gperftools-2.4

(1) 我按照这个做了一个独立的工具链供以后使用: Cross compiling for arm using crystax NDK

命令:

./build/tools/make-standalone-toolchain.sh --system=linux-x86_64 --toolchain=arm-linux-androideabi-4.8 --platform=android-8 --install-dir=$HOME/my-android-toolchain

(2) 谢天谢地,我找到了一个简化./configure工作的脚本: https://gist.github.com/nddrylliog/4688209

并稍微修改了一下(放入gperftools-2.4文件夹):

#!/bin/sh

export DEV_PREFIX=$HOME

export ANDROID_NDK=${DEV_PREFIX}/crystax-ndk-10.2.1/

export CROSS_COMPILE=arm-linux-androideabi

export ANDROID_PREFIX=$HOME/my-android-toolchain

export SYSROOT=${ANDROID_NDK}/platforms/android-8/arch-arm

export CROSS_PATH=${ANDROID_PREFIX}/bin/${CROSS_COMPILE}

export CPP=${CROSS_PATH}-cpp
export AR=${CROSS_PATH}-ar
export AS=${CROSS_PATH}-as
export NM=${CROSS_PATH}-nm
export CC=${CROSS_PATH}-gcc
export CXX=${CROSS_PATH}-g++
export LD=${CROSS_PATH}-ld
export RANLIB=${CROSS_PATH}-ranlib

# export PREFIX=${DEV_PREFIX}/android/prefix

export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig

export CFLAGS="${CFLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${ANDROID_PREFIX}/include -I${DEV_PREFIX}/android/bionic"
export CPPFLAGS="${CFLAGS}"
export LDFLAGS="${LDFLAGS} -L${SYSROOT}/usr/lib -L${ANDROID_PREFIX}/lib"

./configure --host=${CROSS_COMPILE} --with-sysroot=${SYSROOT} "$@"

(3) 然后我实际执行./configure并进行安装:

我将此脚本放在gperftools-2.4文件夹中并运行它:

cd gperftools-2.4
./android_configure.sh --enable-frame-pointers --prefix=$(pwd)
sudo make && make install
cd ..

结果: 上面给出了这个错误:

src/static_vars.cc: In function 'void tcmalloc::SetupAtForkLocksHandler()':
src/static_vars.cc:119:39: error: 'pthread_atfork' was not declared in this scope
                  CentralCacheUnlockAll); // child calls after fork

如果有人能就此给我一些建议,我将不胜感激。

额外: 我知道有一个android-ndk-profiler但是因为我使用CMake进行交叉编译,我不太确定如何搞砸Android.mk所以此刻我会尝试使用gperftools工作正常在linux build。

1 个答案:

答案 0 :(得分:2)

这是因为pthread_atfork仅在Android 5.0中出现在Android libc(Bionic)中。在CrystaX NDK中,并非所有API都被libcrystax取代,特别是所有pthread_xxx API都驻留在libc中。因此,现在唯一能做你想做的事情就是使用android-21作为最小平台,或修改gperftools源,避免使用pthread_atfork

顺便说一句,我们正在努力将所有pthread_xxx API移到libcrystax中,所以我希望即使是早期的Android版本,所有这样的API也很快就会推出。