2

I have successfully compiled multiple static libraries with the ndk toolchain and linked them into my own project. I have to use many cpp files and they need protocol buffers and a ZeroMQ, as a library, to compile successfully. Linking against protocol buffers works great, however, when I link against the ZeroMQ I get the following error:

C:/Users/x/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-  x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-   androideabi/bin/ld.exe: error: ./zmq/lib/libzmq.a(libzmq
_la-zmq.o): incompatible target
collect2.exe: error: ld returned 1 exit status
make.exe: *** [C:/Users/x/Workspace/y/app/src/main//obj/local/armeabi-  v7a/libZ.so] Error 1

I have replaced personal information with x, y, z for a clear reason.

I'm using Windows 8.1 with Android Studio 1.1 RC1 and NDK10d. I compiled the libraries on a Ubuntu and a Debian system (tried different ones). Both use the same arm toolchain.

To compile ZeroMQ I followed the steps from the official page. I tried zeromq3-x and zeromq4-x. I tried the mentioned ndk8 and the new ndk10d.

My Application.mk:

APP_STL := gnustl_static     #tried: c++_static/shared stlport_static/shared
APP_PLATFORM := android-21
APP_USE_CPP0X := true  #tried to omit
APP_CXXFLAGS := -std=gnu++11
APP_CPPFLAGS := -frtti -fexceptions --std=c++11
APP_ABI := armeabi-v7a             #tried different like armeabi, all, x86 - obviously only arm should work
NDK_TOOLCHAIN_VERSION := 4.9

Android.mk without important files to compile because it will crash on the first need of zmq:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := ../jni/protobuf
LOCAL_SRC_FILES := ../jni/protobuf/libprotobuf.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDES :=      C:\Users\x\Android\Proto\.lib arm 5  2.6\protobuf-2.6.0\build\include
LOCAL_EXPORT_C_INCLUDES :=    C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf- 2.6.0\build\include\google
LOCAL_EXPORT_C_INCLUDES := C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-   2.6.0\build\include\google\proto
LOCAL_C_INCLUDES := C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-  2.6.0\build\include
LOCAL_C_INCLUDES := C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-2.6.0\build\include\google
LOCAL_C_INCLUDES := C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-2.6.0\build\include\google\protobuf

include $(PREBUILT_STATIC_LIBRARY)

LOCAL_MODULE := zmq
LOCAL_SRC_FILES := zmq/lib/libzmq.a  
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDES := C:\Users\x\Android\ZMQ\ARM-FINAL\include
LOCAL_EXPORT_C_INCLUDES := zmq/include
LOCAL_C_INCLUDES := C:\Users\x\Android\ZMQ\ARM-FINAL\include
LOCAL_C_INCLUDES := zmq/include

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := Z
LOCAL_CFLAGS := -I/zmq -std=c++11
LOCAL_CPPFLAGS := -I/zmq -std=c++11
LOCAL_CPP_FEATURES += exceptions
LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog
LOCAL_CPP_EXTENSION := .cxx .cpp .cc .h
LOCAL_DISABLE_FORMAT_STRING_CHECKS := true

LOCAL_SRC_FILES := \
    ../jni/protogen/applications.pb.cc \ # this will work
    common/bytearray.cpp \ # this will fail


LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

 LOCAL_C_INCLUDES += C:\Users\x\Android-MasterUI\app\src\main\jni
 LOCAL_C_INCLUDES += ../jni/protogen
 LOCAL_C_INCLUDES += common
 LOCAL_C_INCLUDES +=   C:\Users\x\Android\ZMQ\ARM-FINAL\include
 LOCAL_C_INCLUDES += C:\Users\x\Workspace\\app\src\main\jni\protobuf
 LOCAL_C_INCLUDES += C:\Users\x\Workspace\Android-    MasterUI\app\src\main\jni\protobuf\include
 LOCAL_C_INCLUDES += C:\Users\x\Android-  MasterUI\app\src\main\jni\protobuf\include\google
 LOCAL_C_INCLUDES +=   C:\Users\x\Android\Proto\.lib arm 5   2.6\protobuf-2.6.0\build\include
 LOCAL_C_INCLUDES += C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf- 2.6.0\build\include\google
 LOCAL_C_INCLUDES += C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-2.6.0\build\include\google\protobuf

 LOCAL_STATIC_LIBRARIES := zmq protobuf

 include $(BUILD_SHARED_LIBRARY)

The objdump from the static library looks like this

libzmq_la-address.o:     file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000

I will omit the further ones because they are all the same. There was a better way to dump all the pieces of information with more details about the architecture, but I can not find it anymore.

If you know a better way you may tell me and I will add more information.

Any idea is welcome and appreciated...

user3666197
  • 1
  • 6
  • 50
  • 92
Matthias
  • 158
  • 1
  • 11
  • It looks like the library complied into the host library (a ubuntu/linux box) instead of cross-compiled for arm target. I had the same issue when I followed the zmq link for android build. I ended up using different way to compile it for android. – us_david Feb 25 '16 at 19:25
  • Would be nice to provide your way of compiling – Bato-Bair Tsyrenov Feb 22 '20 at 23:55

0 Answers0