Я изо всех сил пытаюсь получить правильное связывание собственного приложения Android с пользовательским общим объектом, встроенным в то же дерево AOSP.
У меня есть общий объект, построенный с
LOCAL_SRC_FILES += \
src/libscanengine.c
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/
LOCAL_C_INCLUDES += kernel/include/
#every module depending on us will
#automagically have this included
LOCAL_EXPORT_C_INCLUDES := \
$(LOCAL_PATH)/include
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libscanengine
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
Он собирается и устанавливается как вызов команды mm
build/core/dynamic_binary.mk:141: warning: overriding commands for target `.so'
build/core/dynamic_binary.mk:118: warning: ignoring old commands for target `.so'
build/core/shared_library.mk:54: warning: overriding commands for target `.so'
build/core/dynamic_binary.mk:141: warning: ignoring old commands for target `.so'
No private recovery resources for TARGET_DEVICE X
No recovery.fstab for TARGET_DEVICE X
make: Circular .so <- .so dependency dropped.
make: Circular .so <- out/target/product/X/symbols/system/lib/libscanengine dependency dropped.
make: Circular .so <- .so dependency dropped.
target Non-prelinked: libscanengine (out/target/product/X/symbols/system/lib/libscanengine)
target Strip: libscanengine (out/target/product/X/obj/lib/libscanengine)
Install: out/target/product/X/system/lib/libscanengine.so
Однажды я пытаюсь создать собственное приложение, связанное с недавно созданным .so, с помощью следующего Android.mk.
LOCAL_SRC_FILES := \
src/mores.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/include/
#not working: commented out
#LOCAL_LDLIBS += \
-lscanengine
#LOCAL_C_FLAGS += \
-L../../out/target/product/X/system/lib/
LOCAL_SHARED_LIBRARIES := \
libscanengine
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := mores
include $(BUILD_EXECUTABLE)
Я получил:
make: *** No rule to make target `out/target/product/X/obj/lib/libscanengine.so', needed by `out/target/product/X/obj/EXECUTABLES/mores_intermediates/LINKED/mores'. Stop.
Я заметил две вещи: разделяемая библиотека установлена в X / out / lib как libscanengine и не libscanenegine.so как того требует родное приложение.
Мне приходится каждый раз вручную копировать .so, что глупо, поскольку все это должно каким-то образом обрабатываться системой сборки Android.
Кроме того, директива LOCAL_EXPORT_C_INCLUDES не работает. Работает ли он только с PREBUILT_SHARED_OBJECTS?
Версия Android 2.3, Java не используется, все построено под AOSP.
Спасибо
J
LOCAL_C_FLAGS += \
-L../../out/target/product/X/system/lib/
не работает, потому что он должен читать
LOCAL_LDFLAGS += \
-Lout/target/product/X/system/lib
или же
LOCAL_LDFLAGS += \
-L$(LOCAL_PATH)/out/target/product/X/system/lib
Но это не объясняет, почему LOCAL_SHARED_LIBRARIES не работает. Какие команды вы используете для сборки?
Хотя это и не хорошее решение, если цель libscanengine не может быть найдена неявным образом через AOSP, вы всегда можете включить ее вручную, вот так.
include $(AOSP_ROOT)/PATH/TO/libscanengine/Android.mk
Что касается того, почему общий объект не будет построен правильно, хакерское решение предоставляет статический объект непосредственно после общего, который ссылается на него, в Android.mk. Например, это я адаптировал из существующего порта JPEG. Мне нужна была общая библиотека, с которой я мог бы работать на отдельном этапе компиляции, но она не была бы собрана, если бы что-то не требовалось.
$(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_SRC_FILES := \
jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c \
jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c \
jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c \
jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c \
jdinput.c jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c \
jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c jfdctfst.c \
jfdctint.c jidctflt.c jidctred.c jquant1.c \
jquant2.c jutils.c jmemmgr.c \
jmem-android.c
# the assembler is only for the ARM version, don't break the Linux sim
ifneq ($(TARGET_ARCH),arm)
ANDROID_JPEG_NO_ASSEMBLER := true
endif
# temp fix until we understand why this broke cnn.com
#ANDROID_JPEG_NO_ASSEMBLER := true
ifeq ($(strip $(ANDROID_JPEG_NO_ASSEMBLER)),true)
LOCAL_SRC_FILES += jidctint.c jidctfst.c
else
LOCAL_SRC_FILES += jidctint.c jidctfst.S
endif
LOCAL_CFLAGS += -I"$(LOCAL_PATH)/./include" -DAVOID_TABLES
LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays
#LOCAL_CFLAGS += -march=armv6j
LOCAL_MODULE:= jpeg
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := jpeg2
LOCAL_STATIC_LIBRARIES := jpeg
include $(BUILD_SHARED_LIBRARY)
Хотя ни одно из этих решений не является истинным, поскольку они не устраняют основную причину ваших проблем, они могут помочь вам, как и мне, в том, чтобы все работало быстро и автоматически.