Error when compiling a zlib Static library for Android

Asked

Viewed 68 times

0

I have the Android.Mk configuration file for the compilation of zlib for Android, but it contains the compilation options, Shared, Static and host, I only need to compile a Static library, BUILD_STATIC_LIBRARY.

I don’t know what to keep or remove from Android.Mk, as I could compile correctly by removing the unnecessary options?

Android.Mk file:

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

# measurements show that the ARM version of ZLib is about x1.17 faster
# than the thumb one...
LOCAL_ARM_MODE := arm

zlib_files := \
    src/adler32.c \
    src/compress.c \
    src/crc32.c \
    src/deflate.c \
    src/gzclose.c \
    src/gzlib.c \
    src/gzread.c \
    src/gzwrite.c \
    src/infback.c \
    src/inflate.c \
    src/inftrees.c \
    src/inffast.c \
    src/trees.c \
    src/uncompr.c \
    src/zutil.c

LOCAL_MODULE := libz
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += -O3 -DUSE_MMAP

# TODO: This is to work around b/24465209. Remove after root cause is fixed
LOCAL_LDFLAGS_arm := -Wl,--hash-style=both

LOCAL_SRC_FILES := $(zlib_files)
ifneq ($(TARGET_BUILD_APPS),)
  LOCAL_SDK_VERSION := 9
else
  LOCAL_CXX_STL := none
endif
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_ARM_MODE := arm
LOCAL_MODULE := libz
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += -O3 -DUSE_MMAP
LOCAL_SRC_FILES := $(zlib_files)
ifneq ($(TARGET_BUILD_APPS),)
  LOCAL_SDK_VERSION := 9
else
  LOCAL_CXX_STL := none
endif
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := libz
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += -O3 -DUSE_MMAP
LOCAL_SRC_FILES := $(zlib_files)
LOCAL_MULTILIB := both
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
LOCAL_MODULE_HOST_OS := darwin linux windows
LOCAL_CXX_STL := none
include $(BUILD_HOST_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := libz-host
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += -O3 -DUSE_MMAP
LOCAL_SRC_FILES := $(zlib_files)
LOCAL_MULTILIB := both
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
LOCAL_CXX_STL := none
include $(BUILD_HOST_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=        \
    src/test/minigzip.c

LOCAL_MODULE:= gzip

LOCAL_SHARED_LIBRARIES := libz

LOCAL_CXX_STL := none

include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=        \
    src/test/minigzip.c

LOCAL_MODULE:= minigzip

LOCAL_STATIC_LIBRARIES := libz

LOCAL_CXX_STL := none

include $(BUILD_HOST_EXECUTABLE)

$(TARGET_OUT_COMMON_GEN)/zlib_fingerprint : $(wildcard $(LOCAL_PATH)/src/*.[ch])
    printf '%s\n' $^ | LC_ALL=C sort | xargs cat | shasum -a 256 | \
        awk '{printf $$1}' > $@

When trying to compile with the command ndk-build I get the following error:

[root@localhost platform_external_zlib-master]# /run/media/root/linux/Workspace/android-ndk-r11c/ndk-build TARGET_PLATFORM=android-14 TARGET_ARCH_ABI=x86 NDK_PROJECT_PATH=.
Android NDK: Trying to define local module 'z' in /run/media/root/Volume/platform_external_zlib-master/Android.Mk.
Android NDK: But this module was already defined by /run/media/root/Volume/platform_external_zlib-master/Android.Mk.
/run/media/root/Volume/android-ndk-r11c/build/core/build-module.Mk:34: *** Android NDK: Aborting. . Stop.
[root@localhost platform_external_zlib-master]#

1 answer

1


Basically what it took was a code wipe. The reason for the error is still unknown, but with the code below it is possible to compile the zlib according to the parameters passed in ndk-build.

zlib/Android.Mk


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

LOCAL_MODULE := libz
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += -O3 -DUSE_MMAP
LOCAL_SRC_FILES := $(zlib_files)
ifneq ($(TARGET_BUILD_APPS),)
  LOCAL_SDK_VERSION := 9
else
  LOCAL_CXX_STL := none
endif
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

To avoid error due to missing directory jni, create the folder and file below.

zlib/jni/Application.mk with the following content:


NDK_TOOLCHAIN_VERSION := 4.9
APP_ABI := all
APP_PROJECT_PATH := $(shell pwd)
APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/Android.mk

Note: Change the value of NDK_TOOLCHAIN_VERSION according to the version supported by your GCC compiler on Android NDK. Latest aversion uses the value 4.9, for more information see Application.Mk documentation.

Now the zlib library can be compiled for multiple architectures according to the value passed on TARGET_ARCH_ABI simply open the console in the zlib folder with the right click, then selecting the option Open in Console and typing the command:

/run/media/root/linux/workspace/android-ndk-r11c/ndk-build TARGET_PLATFORM=android-14 TARGET_ARCH_ABI=x86 NDK_PROJECT_PATH=.

Recalling that the /run/media/root/linux/workspace/ refers to the location of your Android NDK and the TARGET_ARCH_ABI its architecture, in the example above was used to x86, check the available architectures.

Further information about the compilation can be found on Android NDK.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.