这里有一个相反的解决方案:从标准 Makefile 构建外部库和 Android 包。
作为先决条件,您需要安装进行命令行 Android 开发所需的一切:
- 一个独立的工具链,请参阅 Android NDK 中包含的文档;
- 蚂蚁。
该示例的结构是:外部库的目录和同级Android源的目录,每个目录中都有一个Makefile和一个顶级的递归Makefile:
Makefile
mylib/
Makefile
android/
Makefile
mylib/Makefile
构建一个静态库:
AR=/path/to/standalone/bin/arm-linux-androideabi-ar
CC=/path/to/standalone/bin/arm-linux-androideabi-gcc
libmylib.a: mylib.o
$(AR) rcs libmylib.a mylib.o
mylib.o: mylib.c
$(CC) -c mylib.c -o mylib.o
android/Makefile
提供了构建 Android 包的规则:
- 我们需要在
mylib
修改时复制一个依赖项;
- 我们正在使用一个
jni/ndkmake.c
文件来包装对 android 的调用mylib
并提供特定的东西;
- android 包依赖于 Java 源和共享库。
Makefile 提供了两个目标:(release
默认)和debug
构建发布包或调试包。
NDK_BUILD=/path/to/ndk-build
JAVASRC=src/com/example/ndkmake/NdkMake.java
release: bin/NdkMake-release-unsigned.apk
debug: bin/NdkMake-debug.apk
bin/NdkMake-release-unsigned.apk: libs/armeabi/libndkmake.so $(JAVASRC)
ant release
bin/NdkMake-debug.apk: libs/armeabi/libndkmake.so $(JAVASRC)
ant debug
libs/armeabi/libndkmake.so: jni/ndkmake.c jni/libmylib.a
$(NDK_BUILD)
jni/libmylib.a: ../mylib/libmylib.a
cp ../mylib/libmylib.a jni/libmylib.a
该Android.mk
文件提供了将静态库作为预构建包含在构建中的规则。我们mylib
使用LOCAL_EXPORT_C_INCLUDES
.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ndkmake
LOCAL_SRC_FILES := ndkmake.c
LOCAL_STATIC_LIBRARIES := mylib-prebuilt
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib-prebuilt
LOCAL_SRC_FILES := libmylib.a
LOCAL_EXPORT_C_INCLUDES := ../mylib/
include $(PREBUILT_STATIC_LIBRARY)
现在我们只需要一个顶级 Makefile 来构建两个子目录:
all: libmylib package
libmylib:
cd mylib && $(MAKE)
package:
cd android && $(MAKE)
对库、jni 源或 Java 源的任何更改都将触发包的重建。