2013-12-17 6 views
0

Я пытаюсь правильно подключить собственное приложение Android к пользовательскому общему объекту, построенному в том же дереве AOSP.Установочный путь для обычных общих библиотек Android

Я разделяемый объект построен с

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) 

Он будет построен и установлен в качестве команды мм вызова

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/из/Lib, как libscanengine и не libscanenegine.so, как это требуется нативного приложения.

Мне нужно вручную копировать .so каждый раз, что глупо, поскольку все это должно быть каким-то образом обработано системой сборки Android.

Кроме того, директива LOCAL_EXPORT_C_INCLUDES не работает. Работает ли он только с PREBUILT_SHARED_OBJECTS?

Версия для Android 2.3, Java не задействована, все построено под AOSP.

Спасибо
J

+0

ВКЛЮЧАЕТСЯ для компиляции, а не для связывания. Ваш -L мог бы сработать, но это должно было быть LDFLAGS, а не CFLAGS. Вы должны выяснить и исправить неверное. –

ответ

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

0

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

include $(AOSP_ROOT)/PATH/TO/libscanengine/Android.mk 

Относительно того, почему общий объект не будет строить правильно, Hacky решение обеспечивает статический объект непосредственно после общей один, который ссылается на нее, в 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) 

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

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