【问题标题】:Android native shared libraries installation pathAndroid原生共享库安装路径
【发布时间】:2013-12-17 11:37:00
【问题描述】:

我正在努力让原生 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

一旦我尝试使用以下 Android.mk 构建与新创建的 .so 链接的本机应用程序

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.

我注意到两件事:共享库作为 libscanengine 安装在 X/out/lib 下,而不是本地应用程序所需的 libscanenegine.so。

我每次都必须手动复制 .so,这很愚蠢,因为所有这些都应该由 Android 构建系统以某种方式处理。

此外,LOCAL_EXPORT_C_INCLUDES 指令不起作用。它仅适用于 PREBUILT_SHARED_OBJECTS 吗?

Android 版本是 2.3,不涉及 Java,一切都在 AOSP 下构建。

谢谢
j

【问题讨论】:

  • INCLUDES 用于编译,而不是链接。您的 -L 可能有效,但它应该是 LDFLAGS 而不是 CFLAGS。不过,您必须弄清楚并修复错误的命名。

标签: android c++ android-ndk android-source


【解决方案1】:
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 不起作用。你使用什么命令来构建?

【讨论】:

    【解决方案2】:

    虽然不是一个好的解决方案,但如果无法通过 AOSP 隐式找到 libscanengine 目标,那么您始终可以手动包含它,就像这样。

    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)
    

    虽然这些都不是真正的解决方案,因为它们不能解决问题背后的根本原因,但它们可能会帮助你,就像他们对我所做的那样,让工作快速、自动地工作。

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      相关资源
      最近更新 更多