I have succeeded in building a single native shared (.so) library for multiple architectures by just specifying the architectures in Application.mk using APP_ABI := armeabi armeabi-v7a x86
However, I have a situation where I have another native library depending on the first one and *both* need to be compiled for multiple architectures.
My example uses libogg and libvorbis, where libvorbis depends on libogg.
I need to build:
1. libogg for armeabi, armeabi-v7a and x86
2. libvorbis for armeabi, armeabi-v7a and x86, so that each built architecture depends on the libogg artifact of the corresponding architecture
If I specify only one dependency on libogg for libvorbis, build fails on x86, as it tries to link x86 code with arm code:
<dependency>
<groupId>native.lib</groupId>
<artifactId>ogg</artifactId>
<version>${project.version}</version>
<classifier>armeabi</classifier>
<type>so</type>
</dependency>
The failure happens here:
[DEBUG] /home/mikael/software/android/android-ndk/toolchains/x86-4.6/prebuilt/linux-x86_64/bin/i686-linux-android-g++ -Wl,-soname,libvorbis.so -shared --sysroot=/home/mikael/software/android/android-ndk/platforms/android-9/arch-x86 ./obj/local/x86/objs/vorbis/mdct.o ./obj/local/x86/objs/vorbis/smallft.o ./obj/local/x86/objs/vorbis/block.o ./obj/local/x86/objs/vorbis/envelope.o ./obj/local/x86/objs/vorbis/window.o ./obj/local/x86/objs/vorbis/lsp.o ./obj/local/x86/objs/vorbis/lpc.o ./obj/local/x86/objs/vorbis/analysis.o ./obj/local/x86/objs/vorbis/synthesis.o ./obj/local/x86/objs/vorbis/psy.o ./obj/local/x86/objs/vorbis/info.o ./obj/local/x86/objs/vorbis/floor1.o ./obj/local/x86/objs/vorbis/floor0.o ./obj/local/x86/objs/vorbis/res0.o ./obj/local/x86/objs/vorbis/mapping0.o ./obj/local/x86/objs/vorbis/registry.o ./obj/local/x86/objs/vorbis/codebook.o ./obj/local/x86/objs/vorbis/sharedbook.o ./obj/local/x86/objs/vorbis/lookup.o ./obj/local/x86/objs/vorbis/bitrate.o ./obj/local/x86/objs/vorbis/vorbisfile.o ./obj/local/x86/objs/vorbis/vorbisenc.o -lgcc ./obj/local/x86/ogg-1.0-SNAPSHOT-armeabi.so -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -lc -lm -o ./obj/local/x86/libvorbis.so
[INFO] /home/mikael/software/android/android-ndk/toolchains/x86-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: error: ./obj/local/x86/ogg-1.0-SNAPSHOT-armeabi.so: incompatible target
[INFO] /home/mikael/software/android/android-ndk/toolchains/x86-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: ./obj/local/x86/objs/vorbis/block.o: in function vorbis_block_init:jni/libvorbis/block.c:106: error: undefined reference to 'oggpack_writeinit'
If I specify multiple dependencies using different classifiers, build fails in the very beginning stating that libogg has already been included in the build:
<dependency>
<groupId>native.lib</groupId>
<artifactId>ogg</artifactId>
<version>${project.version}</version>
<classifier>armeabi</classifier>
<type>so</type>
</dependency>
<dependency>
<groupId>native.lib</groupId>
<artifactId>ogg</artifactId>
<version>${project.version}</version>
<classifier>armeabi-v7a</classifier>
<type>so</type>
</dependency>
<dependency>
<groupId>native.lib</groupId>
<artifactId>ogg</artifactId>
<version>${project.version}</version>
<classifier>x86</classifier>
<type>so</type>
</dependency>
And the corresponding error messages are:
[DEBUG] findNativeLibraryDependencies found 3: [native.lib:ogg:so:armeabi:1.0-SNAPSHOT:compile, native.lib:ogg:so:armeabi-v7a:1.0-SNAPSHOT:compile, native.lib:ogg:so:x86:1.0-SNAPSHOT:compile]
[DEBUG] resolveArtifacts found 3: [native.lib:ogg:so:armeabi:1.0-SNAPSHOT:compile, native.lib:ogg:so:armeabi-v7a:1.0-SNAPSHOT:compile, native.lib:ogg:so:x86:1.0-SNAPSHOT:compile]
[DEBUG] Listing LOCAL_EXPORT_C_INCLUDES for native.lib:ogg:so:armeabi:1.0-SNAPSHOT: [/tmp/android_maven_plugin_native_includes1369326778780_ogg/ogg/ogg.h, /tmp/android_maven_plugin_native_includes1369326778780_ogg/ogg/config_types.h, /tmp/android_maven_plugin_native_includes1369326778780_ogg/ogg/os_types.h]
[DEBUG] Listing LOCAL_EXPORT_C_INCLUDES for native.lib:ogg:so:armeabi-v7a:1.0-SNAPSHOT: [/tmp/android_maven_plugin_native_includes1369326778794_ogg/ogg/ogg.h, /tmp/android_maven_plugin_native_includes1369326778794_ogg/ogg/config_types.h, /tmp/android_maven_plugin_native_includes1369326778794_ogg/ogg/os_types.h]
[DEBUG] Listing LOCAL_EXPORT_C_INCLUDES for native.lib:ogg:so:x86:1.0-SNAPSHOT: [/tmp/android_maven_plugin_native_includes1369326778797_ogg/ogg/ogg.h, /tmp/android_maven_plugin_native_includes1369326778797_ogg/ogg/config_types.h, /tmp/android_maven_plugin_native_includes1369326778797_ogg/ogg/os_types.h]
[DEBUG] Set ANDROID_MAVEN_PLUGIN_LOCAL_SHARED_LIBRARIES = ogg ogg ogg
[INFO] /home/mikael/software/android/android-ndk/ndk-build [-C, /home/mikael/.../libvorbis, V=1, vorbis]
[DEBUG] [INFO] /home/mikael/software/android/android-ndk/build/core/build-module.mk:34: *** Android NDK: Aborting. . Stop.
Android NDK: Trying to define local module 'ogg' in jni/libvorbis/Android.mk.
[DEBUG] Android NDK: But this module was already defined by jni/libvorbis/Android.mk.
Is it even possible to do what I'm trying to achieve?
I'm using android-maven-plugin 3.6.0 and Android SDK version 22 on Linux.