顾名思义,预建库永远不会被构建(它们已经被构建)。如果您需要再次构建预构建的库,您将需要包含它们的源代码并更改您的 Android.mk 以使用这些源代码再次构建这些模块,使用 BUILD_SHARED_LIBRARY。但是,您可以将整个库源代码树包含到一个libs
文件夹中,并将它的 Android.mk 包含到您的文件夹中。
请注意,您添加的库仅在其源更改且不受其他模块更改的影响时才会构建。
一个基本的例子如下:
首先是项目的布局。有3个模块:
- ver:这是一个库: libver.so 。包括来源。作为 ndk-build 的一部分构建
- 魔术:这是一个预建库: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没有重建):
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