Путь установки собственных общих библиотек Android

0

Я изо всех сил стараюсь правильно привязать собственное приложение 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

  • 0
    Включает в себя для компиляции, а не ссылки. Ваш -L мог бы сработать, но это должны были быть LDFLAGS, а не CFLAGS. Вы должны выяснить и исправить неправильное название.
Теги:
android-ndk
android-source

2 ответа

0

Хотя это не хорошее решение, если цель 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)

Хотя ни то, ни другое не являются истинными решениями, поскольку они не затрагивают основную причину ваших проблем, они могут помочь вам, как и я, в том, чтобы быстро и автоматически работать.

0
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 не работает. Какие команды вы используете для сборки?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню