Cross Compiling libevent for Android

匿名 (未验证) 提交于 2019-12-03 02:47:02

问题:

I'm stuck trying to cross-compile libevent to Android and I'd like to know what I'm doing wrong and get some assistance.

The version I'm trying to build is libevent-2.0.19-stable

I started following the steps described at http://warpedtimes.wordpress.com/2010/02/03/building-open-source-libraries-with-android-ndk/ and how to rewrite the Makefile into android.mk?

The Target Device is a Samsung Galaxy S2 running cyanogenMod 7

After several attempts, the best I did was by running the following steps:

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/ 

You need to export the ABI for your device. armeabi-v7a is for devices with ARMv7 or above, any other device uses armeabi.

4) Execute ./configure with the appropriate parameters:

./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" 

There was a warning in the meantime:

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 

(I assume it's fine)

As it didn't recognise arm-linux-androideabi as a host, I got a new config.guess and config.sub from http://git.savannah.gnu.org/gitweb/?p=config.git;a=tree (indicated in the previous thread in Stack Overflow)

At this point, when building the source code running "make", it still crashes:

However, the file seems to be there:

~/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 

Is there anything I'm doing wrong when running ./configure? Something else I didn't understand even looking at Android's NDK documentation was whether it was mandatory to create an Android.mk or if Makefile was sufficient

Any help will be very welcome!

Cheers

N

Note

This is how I managed to solve it in the end:

Initial PATH:

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/ 

The errors seem to occur in the linking phase so as it cannot find crtend_so.o and crtbegin_so.o. Following crtbegin_so.o missing for android toolchain (custom build), we add a sym link to them in the source folder

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  

The ./configure command:

./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" 

If it fails as it does not recognize system androideabi, try to get newer versions of config.sub and config.guess

It used to crash in the linking phase. Including -lgcc on the CFLAGS solved the issue.

回答1:

Try this

./configure --host=arm-linux-androideabi CC="$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT" CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16' 

It works for me.



回答2:

This project builds libevent as a static library on Android here: https://github.com/ventureresearch/libevent

It includes the Android.mk and generated config files to build it cleanly.

Note that we are building it for inclusion into an Android device image, and NOT building through the NDK. It would probably still be a good place to start.



回答3:

Try with below configurations:

ANDROID_SYSROOT=$ANDROID_ROOT/platforms/android-8/arch-arm/  ./configure --host=arm-linux-androideabi CFLAGS=--sysroot=$ANDROID_SYSROOT LDFLAGS=--sysroot=$ANDROID_SYSROOT 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!