【问题标题】:Calling inner Android.mk file to build prebuilt libraries not working调用内部 Android.mk 文件来构建预建库不起作用
【发布时间】:2012-04-18 15:35:22
【问题描述】:

我有一个项目组织如下:

project/jni/Android.mk
project/jni/libA/Android.mk
project/jni/libB/Android.mk
project/lib/armeabi/libA.so
project/lib/armeabi/libB.so

我的 libA 和 libB 在我的主 Android.mk 上设置为预构建库,因为我不希望每次构建我的主 Android.mk 时都构建它们。这是我所拥有的:

LOCAL_PATH := $(call my-dir)

###########################################    
# Declare the prebuilt A library    
###########################################
include $(CLEAR_VARS)
LOCAL_MODULE := A-prebuilt
LOCAL_SRC_FILES := ../lib/$(TARGET_ARCH_ABI)/libA.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libA
include $(PREBUILT_SHARED_LIBRARY)

###########################################    
# Declare the prebuilt B library    
###########################################    
include $(CLEAR_VARS)     
LOCAL_MODULE := B-prebuilt    
LOCAL_SRC_FILES := ../lib/$(TARGET_ARCH_ABI)/libB.so    
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libB/include    
include $(PREBUILT_SHARED_LIBRARY)        

###########################################    
# Declare our main module    
###########################################    
include $(CLEAR_VARS)
LOCAL_MODULE := libjnimain    
LOCAL_SRC_FILES := \    
    main.c

# for logging
LOCAL_LDLIBS    += -llog

# include the prebuilt libraries    
LOCAL_SHARED_LIBRARIES := \
A-prebuilt \    
B-prebuilt

#This will include all Android.mk files in sub-directories 
#of the current build file's path.
include $(call all-subdir-makefiles)    
include $(BUILD_SHARED_LIBRARY)

我遇到的主要问题是构建预构建库。我似乎无法通过调用他们的 Android.mk 来构建 libA 或 libB,因为当我调用主 Android.mk 时。任何帮助将不胜感激。

【问题讨论】:

    标签: android-ndk


    【解决方案1】:

    顾名思义,预建库永远不会被构建(它们已经被构建)。如果您需要再次构建预构建的库,您将需要包含它们的源代码并更改您的 Android.mk 以使用这些源代码再次构建这些模块,使用 BUILD_SHARED_LIBRARY。但是,您可以将整个库源代码树包含到 libs 文件夹中,并将其 Android.mk 包含到您的文件夹中。

    请注意,您添加的库仅在其源代码更改时才会构建,并且不会受到其他模块更改的影响。

    一个基本的例子如下:

    首先是项目的布局。有3个模块:

    • ver:这是一个库:libver.so。包括来源。作为 ndk-build 的一部分构建
    • magic:这是一个预建库:libmagic.so
    • getver:正在构建的可执行文件

    文件布局:

    sdk@AndroidDev:~/ndk/sources/getver$ find jni/
    jni/
    jni/getver.c
    jni/libs
    jni/libs/libver
    jni/libs/libver/compiled_ver.c
    jni/libs/libver/Android.mk
    jni/libs/libver/ver.h
    jni/libs/libmagic.so
    jni/libs/Android.mk
    jni/Android.mk
    

    接下来,顶层 Android.mk(它在 jni/ 中):

    sdk@AndroidDev:~/ndk/sources/getver$ cat jni/Android.mk
    LOCAL_PATH := $(call my-dir)
    my_LOCAL_PATH := $(LOCAL_PATH)
    
    # Include all libs (built and prebuilt)
    include $(LOCAL_PATH)/libs/Android.mk
    
    # Build my executable
    LOCAL_PATH := $(my_LOCAL_PATH)
    include $(CLEAR_VARS)
    LOCAL_MODULE    := getver
    LOCAL_SRC_FILES := getver.c
    LOCAL_SHARED_LIBRARIES= ver magic
    include $(BUILD_EXECUTABLE)
    

    jni/libs/Android.mk,用于包含所有库:

    sdk@AndroidDev:~/ndk/sources/getver$ cat jni/libs/Android.mk
    LOCAL_PATH := $(call my-dir)
    
    # Prebuilt Lib
    include $(CLEAR_VARS)
    LOCAL_MODULE := magic
    LOCAL_SRC_FILES := libmagic.so
    include $(PREBUILT_SHARED_LIBRARY)
    
    # Lib to be built as part of building process.
    include $(CLEAR_VARS)
    include $(LOCAL_PATH)/libver/Android.mk
    

    最后是libver.so的Android.mk(jni/libs/libver/Android.mk):

    sdk@AndroidDev:~/ndk/sources/getver$ cat jni/libs/libver/Android.mk
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE    := ver
    LOCAL_HDR_FILES := ver.h
    LOCAL_SRC_FILES := compiled_ver.c
    include $(BUILD_SHARED_LIBRARY)
    

    在上面的示例中,永远不会构建 libmagic.so,因为它是一个预构建的库。但是,每次 libver 源更改时都会构建 libver.so。 getver 源发生变化时不会重建。下面的图解示例(我使用 touch 命令来模拟 getver.c 源代码的变化):

    第一次构建:

    sdk@AndroidDev:~/ndk/sources/getver$ ../../ndk-build
    Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
    Gdbsetup       : libs/armeabi/gdb.setup
    Compile thumb  : getver <= getver.c
    Compile thumb  : ver <= compiled_ver.c
    SharedLibrary  : libver.so
    Executable     : getver
    Install        : getver => libs/armeabi/getver
    Prebuilt       : libmagic.so <= jni/libs/
    Install        : libmagic.so => libs/armeabi/libmagic.so
    Install        : libver.so => libs/armeabi/libver.so
    

    模拟getver模块源的编辑:

    sdk@AndroidDev:~/ndk/sources/getver$ touch jni/getver.c
    

    重建(注意 libver.so 是 NOT 重建):

    sdk@AndroidDev:~/ndk/sources/getver$ ../../ndk-build
    Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
    Gdbsetup       : libs/armeabi/gdb.setup
    Compile thumb  : getver <= getver.c
    Executable     : getver
    Install        : getver => libs/armeabi/getver
    Install        : libmagic.so => libs/armeabi/libmagic.so
    Install        : libver.so => libs/armeabi/libver.so
    

    模拟 libver.so 源代码的编辑

    sdk@AndroidDev:~/ndk/sources/getver$ touch jni/libs/libver/compiled_ver.c
    

    重建(注意 getver 已重建,因为它依赖于 libver.so:

    sdk@AndroidDev:~/ndk/sources/getver$ ../../ndk-build
    Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
    Gdbsetup       : libs/armeabi/gdb.setup
    Compile thumb  : ver <= compiled_ver.c
    SharedLibrary  : libver.so
    Executable     : getver
    Install        : getver => libs/armeabi/getver
    Install        : libmagic.so => libs/armeabi/libmagic.so
    Install        : libver.so => libs/armeabi/libver.so
    

    【讨论】:

    • 感谢您的回答。解释得很好。
    【解决方案2】:

    您可以在更高级别的 Android.mk 文件中使用以下内容以递归方式遍历目录。你将它放在 project/jni/Android.mk 中,它会进入 libA 和 libB 并处理其中的 Android.mk 文件。

    include $(call all-subdir-makefiles)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多