Cross Compiling libevent para Android

Eu estou preso tentando cross-compilar libevent para o Android e gostaria de saber o que estou fazendo de errado e obter alguma ajuda.

A versão que estou tentando construir é libevent-2.0.19-stable

Comecei a seguir os passos descritos emhttp://warpedtimes.wordpress.com/2010/02/03/building-open-source-libraries-with-android-ndk/ ecomo reescrever o Makefile em android.mk?

O dispositivo de destino é um Samsung Galaxy S2 em execução cyanogenMod 7

Depois de várias tentativas, o melhor que fiz foi executar as seguintes etapas:

1) Install android NDK and download libevent source code

2) Android NDK downloaded and running in ~/android-ndk/android-ndk-r8b

3) Execute:

export ANDROID_ROOT=~/android-ndk/android-ndk-r8b

export    PATH=$PATH:$ANDROID_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/

Você precisa exportar o ABI para o seu dispositivo. armeabi-v7a é para dispositivos com ARMv7 ou superior, qualquer outro dispositivo usa armeabi.

4) Execute ./configure com os parâmetros apropriados:

./configure \
--host=arm-linux-androideabi \
CC=arm-linux-androideabi-gcc \
LD=arm-linux-androideabi-ld \
CPPFLAGS="-I$ANDROID_ROOT/platforms/android-8/arch-arm/usr/include/" \
CFLAGS="-nostdlib" \
LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/ -L$ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/" \
LIBS="-lc"

Houve um aviso nesse meio tempo:

configure: WARNING: if you wanted to set the --build type, don't use --host.
If a cross compiler is detected then cross compile mode will be used

(Eu suponho que está bem)

Como ele não reconheceu o arm-linux-androideabi como host, recebi um novo config.guess e config.sub dehttp://git.savannah.gnu.org/gitweb/?p=config.git;a=tree (indicado no tópico anterior no Stack Overflow)

Neste ponto, ao criar o código-fonte executando "make", ele ainda falha:

/home/narseo/android-ndk/android-ndk-r8b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: crtbegin_so.o: No such file: No such file or directory
collect2: ld returned 1 exit status
make[2]: *** [libevent.la] Error 1
make[2]: se sale del directorio «/home/narseo/libevent-source/libevent-2.0.19-stable»
make[1]: *** [all-recursive] Error 1
make[1]: se sale del directorio «/home/narseo/libevent-source/libevent-2.0.19-stable»
make: *** [all] Error 2

No entanto, o arquivo parece estar lá:

~/android-ndk$ ls $ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib
crtbegin_dynamic.o  libc.a           libjnigraphics.so  libstdc++.so
crtbegin_so.o       libc.so          liblog.so          libthread_db.so
crtbegin_static.o   libdl.so         libm.a             libz.so
crtend_android.o    libGLESv1_CM.so  libm.so
crtend_so.o         libGLESv2.so     libstdc++.a

Existe alguma coisa que estou fazendo errado ao executar ./configure? Outra coisa que eu não entendi, mesmo olhando para a documentação do NDK do Android, era se era obrigatório criar um Android.mk ou se o Makefile era suficiente

Qualquer ajuda será muito bem vinda!

Felicidades

N

Nota

Foi assim que consegui resolvê-lo no final:

CAMINHO inicial:

export ANDROID_ROOT=~/android-ndk/android-ndk-r8b
export PATH=$PATH:$ANDROID_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/
export PATH=$PATH:$ANDROID_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/include/

Os erros parecem ocorrer na fase de vinculação, de modo que não é possível encontrar crtend_so.o e crtbegin_so.o. Seguecrtbegin_so.o faltando para android toolchain (custom build), adicionamos um link sym a eles na pasta de origem

cd source && ln -s $ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/crtbegin_so.o 
ln -s $ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/crtend_so.o 

O comando ./configure:

./configure \
--host=arm-linux-androideabi \
CC=arm-linux-androideabi-gcc \
LD=arm-linux-androideabi-ld \
CPPFLAGS="-I$ANDROID_ROOT/platforms/android-8/arch-arm/usr/include/" \
CFLAGS="-nostdlib" \
LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/ -L$ANDROID_ROOT/platforms/android-8/arch-arm/usr/lib/" \
LIBS="-lc"

Se falhar, pois não reconhece o sistema androideabi, tente obter versões mais recentes de config.sub e config.guess

Ele costumava travar na fase de vinculação. Incluindo -lgcc no CFLAGS resolveu o problema.

questionAnswers(3)

yourAnswerToTheQuestion