2013-10-28 6 views
1

Я разрабатываю приложение, в котором я использую indic-text-renderer для рендеринга текста devnagri. Поскольку это библиотека NDK, я пытаюсь ее скомпилировать с помощью команды ndk-build. Но это дает мне следующую ошибку:Невозможно скомпилировать библиотеку harfbuz_ng с помощью NDK

Android NDK: Trying to define local module 'harfbuzz_ng' in /cygdrive/d/Project_WorkSpace/indic-text-renderer//jni/harfbuzz-ng/Android.mk. 
Android NDK: But this module was already defined by /cygdrive/d/Project_WorkSpace/indic-text-renderer//jni/harfbuzz-ng/Android.mk. 

Мой файл android.mk является:

LOCAL_PATH := $(call my-dir) 

MY_LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_ARM_MODE := arm 

LOCAL_MODULE := complex-script-rendering 

LOCAL_C_INCLUDES := $(LOCAL_PATH)/freetype/include $(LOCAL_PATH)/harfbuzz-ng/src 

LOCAL_SRC_FILES := complex-script-rendering.c 

LOCAL_STATIC_LIBRARIES := ft2 harfbuzz 

LOCAL_LDLIBS := -llog 

include $(BUILD_SHARED_LIBRARY) 

include $(MY_LOCAL_PATH)/freetype/Android.mk 

include $(MY_LOCAL_PATH)/harfbuzz-ng/Android.mk 

JNI-hierarchy

Как я могу исправить эту ошибку?

Я новичок в программировании NDK, так пожалуйста, дайте мне знать, если эта информация не является достаточным

Edit:

FreeType/Android.mk

ifndef USE_FREETYPE 
USE_FREETYPE := 2.4.2 
endif 

ifeq ($(USE_FREETYPE),2.4.2) 
LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 

# compile in ARM mode, since the glyph loader/renderer is a hotspot 
# when loading complex pages in the browser 
# 
LOCAL_ARM_MODE := arm 

LOCAL_SRC_FILES:= \ 
    src/base/ftbbox.c \ 
    src/base/ftbitmap.c \ 
    src/base/ftfstype.c \ 
    src/base/ftglyph.c \ 
    src/base/ftlcdfil.c \ 
    src/base/ftstroke.c \ 
    src/base/fttype1.c \ 
    src/base/ftxf86.c \ 
    src/base/ftbase.c \ 
    src/base/ftsystem.c \ 
    src/base/ftinit.c \ 
    src/base/ftgasp.c \ 
    src/raster/raster.c \ 
    src/sfnt/sfnt.c \ 
    src/smooth/smooth.c \ 
    src/autofit/autofit.c \ 
    src/truetype/truetype.c \ 
    src/cff/cff.c \ 
    src/psnames/psnames.c \ 
    src/pshinter/pshinter.c 

LOCAL_C_INCLUDES += \ 
    $(LOCAL_PATH)/builds \ 
    $(LOCAL_PATH)/include 

LOCAL_CFLAGS += -W -Wall 
LOCAL_CFLAGS += -fPIC -DPIC 
LOCAL_CFLAGS += "-DDARWIN_NO_CARBON" 
LOCAL_CFLAGS += "-DFT2_BUILD_LIBRARY" 

# the following is for testing only, and should not be used in final builds 
# of the product 
#LOCAL_CFLAGS += "-DTT_CONFIG_OPTION_BYTECODE_INTERPRETER" 

LOCAL_CFLAGS += -O2 

LOCAL_MODULE:= libft2 

include $(BUILD_STATIC_LIBRARY) 
endif 

harfbuzz-ng/android.mk

LOCAL_PATH:= $(call my-dir) 

HARFBUZZ_SRC_FILES = \ 
    src/hb-blob.cc \ 
    src/hb-buffer-serialize.cc \ 
    src/hb-buffer.cc \ 
    src/hb-common.cc \ 
    src/hb-fallback-shape.cc \ 
    src/hb-face.cc \ 
    src/hb-font.cc \ 
    src/hb-ot-tag.cc \ 
    src/hb-set.cc \ 
    src/hb-shape.cc \ 
    src/hb-shape-plan.cc \ 
    src/hb-shaper.cc \ 
    src/hb-tt-font.cc \ 
    src/hb-unicode.cc \ 
    src/hb-warning.cc \ 
    src/hb-ot-layout.cc \ 
    src/hb-ot-map.cc \ 
    src/hb-ot-shape.cc \ 
    src/hb-ot-shape-complex-arabic.cc \ 
    src/hb-ot-shape-complex-default.cc \ 
    src/hb-ot-shape-complex-indic.cc \ 
    src/hb-ot-shape-complex-indic-table.cc \ 
    src/hb-ot-shape-complex-myanmar.cc \ 
    src/hb-ot-shape-complex-sea.cc \ 
    src/hb-ot-shape-complex-thai.cc \ 
    src/hb-ot-shape-normalize.cc \ 
    src/hb-ot-shape-fallback.cc 

############################################################# 
# build the harfbuzz library 
# 

include $(CLEAR_VARS) 

LOCAL_ARM_MODE := arm 

LOCAL_MODULE_TAGS := optional 

LOCAL_SRC_FILES:= \ 
    $(HARFBUZZ_SRC_FILES) \ 
    src/hb-icu.cc 

LOCAL_CPP_EXTENSION := .cc 

LOCAL_SHARED_LIBRARIES := \ 
     libcutils \ 
     libicuuc \ 
     libicui18n \ 
     libutils 

LOCAL_C_INCLUDES += \ 
     $(LOCAL_PATH)/src \ 
     external/icu4c/common 

LOCAL_CFLAGS += -DHB_NO_MT -DHAVE_OT -DHAVE_ICU 

LOCAL_LDLIBS += -lpthread 

LOCAL_MODULE:= libharfbuzz_ng 

include $(BUILD_SHARED_LIBRARY) 

############################################################# 
# build the harfbuzz static library 
# 
include $(CLEAR_VARS) 

LOCAL_ARM_MODE := arm 
LOCAL_MODULE_TAGS := optional 
LOCAL_SRC_FILES:= \ 
    $(HARFBUZZ_SRC_FILES) \ 
    src/hb-ucdn.cc \ 
    src/hb-ucdn/ucdn.c 

LOCAL_CPP_EXTENSION  := .cc 
LOCAL_STATIC_LIBRARIES := libft2 
LOCAL_C_INCLUDES  := \ 
    $(LOCAL_PATH)/src \ 
    external/freetype/include 
LOCAL_CFLAGS += -DHB_NO_MT -DHAVE_OT -DHAVE_UCDN -DHAVE_FREETYPE 
LOCAL_LDLIBS += -lpthread 

LOCAL_MODULE:= libharfbuzz_ng 

include $(BUILD_STATIC_LIBRARY) 
+0

Можете ли вы разместить содержание 'freetype/Android.mk' и' harfbuzz-ng/Android.mk'? – ozbek

+0

@ shoe rat: я положил соответствующие .mk PLS посмотреть – dd619

+0

Почему существуют два идентичных 'LOCAL_MODULE: = libharfbuzz_ng', определенные в' harfbuzz-ng/Android.mk'? – ozbek

ответ

1

Я попытался удалить весь блок BUILD_SHARED_LIBRARY, и он прекратил жаловаться на проблему переопределения, потому что я хотел скомпилировать harfbuzz-ng как статическую библиотеку. Вы можете попробовать.

В прошлый раз, когда я получил эту ошибку, это когда я перекрестно компилирую freetype и использую его как PRE-встроенную статическую библиотеку в моем проекте, я экспортировал NDK-MODULE-PATH, и все же есть строка в моем jni/Android .mk написан include $(MY_LOCAL_PATH)/freetype/Android.mk

Так что я просто прокомментирую эту строку, и все работает нормально.

Потому что, когда вы устанавливаете NDK-MODULE-PATH, компилятор будет искать в вашем каталоге PATH и искать Android.mk и скомпилировать источник с ним. обратитесь к this, и я надеюсь, что это вам поможет.

+0

Приятно слышать, что у вас это работает !!!, можно ли вставить измененные файлы? – dd619

1

мой JNI/Android.mk выглядит следующим образом:

LOCAL_PATH := $(call my-dir) 

MY_LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_ARM_MODE := arm 

LOCAL_MODULE := complex-script-rendering 

LOCAL_C_INCLUDES := $(LOCAL_PATH)/freetype/include $(LOCAL_PATH)/harfbuzz-ng/src 

LOCAL_SRC_FILES := complex-script-rendering.c 

LOCAL_STATIC_LIBRARIES := libfreetype libharfbuzz 

LOCAL_LDLIBS := -llog 

include $(BUILD_SHARED_LIBRARY) 
$(call import-module,freetype) 

#include $(MY_LOCAL_PATH)/freetype/Android.mk 

include $(MY_LOCAL_PATH)/harfbuzz-ng/Android.mk 

и HarfBuzz-нг/Android.mk:

LOCAL_PATH:= $(call my-dir) 

HARFBUZZ_SRC_FILES = \ 
    src/hb-blob.cc \ 
    src/hb-buffer-serialize.cc \ 
    src/hb-buffer.cc \ 
    src/hb-common.cc \ 
    src/hb-fallback-shape.cc \ 
    src/hb-face.cc \ 
    src/hb-font.cc \ 
    src/hb-ot-tag.cc \ 
    src/hb-ft.cc \ 
    src/hb-set.cc \ 
    src/hb-shape.cc \ 
    src/hb-shape-plan.cc \ 
    src/hb-shaper.cc \ 
    src/hb-tt-font.cc \ 
    src/hb-unicode.cc \ 
    src/hb-warning.cc \ 
    src/hb-ot-layout.cc \ 
    src/hb-ot-map.cc \ 
    src/hb-ot-shape.cc \ 
    src/hb-ot-shape-complex-arabic.cc \ 
    src/hb-ot-shape-complex-default.cc \ 
    src/hb-ot-shape-complex-indic.cc \ 
    src/hb-ot-shape-complex-indic-table.cc \ 
    src/hb-ot-shape-complex-myanmar.cc \ 
    src/hb-ot-shape-complex-sea.cc \ 
    src/hb-ot-shape-complex-thai.cc \ 
    src/hb-ot-shape-normalize.cc \ 
    src/hb-ot-shape-fallback.cc 

############################################################# 
# build the harfbuzz library 
# 
# 
#include $(CLEAR_VARS) 
# 
#LOCAL_ARM_MODE := arm 
# 
#LOCAL_MODULE_TAGS := optional 
# 
#LOCAL_SRC_FILES:= \ 
# $(HARFBUZZ_SRC_FILES) \ 
# src/hb-icu.cc 
# 
#LOCAL_CPP_EXTENSION := .cc 
# 
#LOCAL_SHARED_LIBRARIES := \ 
#  libcutils \ 
#  libicuuc \ 
#  libicui18n \ 
#  libutils 
# 
#LOCAL_C_INCLUDES += \ 
#  $(LOCAL_PATH)/src \ 
#  external/icu4c/common 
# 
#LOCAL_CFLAGS += -DHB_NO_MT -DHAVE_OT -DHAVE_ICU 
# 
#LOCAL_LDLIBS += -lpthread 
# 
#LOCAL_MODULE:= libharfbuzz_ng 
# 
#include $(BUILD_SHARED_LIBRARY) 

############################################################# 
# build the harfbuzz static library 
# 
include $(CLEAR_VARS) 

LOCAL_ARM_MODE := arm 
LOCAL_MODULE_TAGS := optional 
LOCAL_SRC_FILES:= \ 
    $(HARFBUZZ_SRC_FILES) \ 
    src/hb-ucdn.cc \ 
    src/hb-ucdn/ucdn.c 

LOCAL_CPP_EXTENSION  := .cc 
LOCAL_STATIC_LIBRARIES := libfreetype 
LOCAL_C_INCLUDES  := \ 
    $(LOCAL_PATH)/src \ 
    $(LOCAL_PATH)/src/hb-ucdn \ 
    external/freetype/include 
LOCAL_CFLAGS += -DHB_NO_MT -DHAVE_OT -DHAVE_UCDN -DHAVE_FREETYPE 
LOCAL_LDLIBS += -lpthread 

LOCAL_MODULE:= libharfbuzz 

include $(BUILD_STATIC_LIBRARY) 

и у меня есть файл build.sh в моем каталоге JNI, который будет Exort мой Freetype модуль, достаточно прост:

export NDK_MODULE_PATH=/home/***/workspace/indic-text-renderer/jni 

ndk-build 

Помимо всего этого, у вас будет кросс-компиляции библиотеки Freetype.

Желаю удачи, это обошлось мне почти неделю.

Смежные вопросы