这里有一个相反的解决方案:构建
来自标准 Makefile 的外部库和 Android 包。
作为先决条件,您需要安装执行命令行所需的一切
安卓开发:
- 独立工具链,请参阅 Android NDK 中包含的文档;
- 蚂蚁。
例子的结构是:外部库的目录
以及与 Makefile 处于同一级别的 Android 源代码目录
在每个目录和一个顶级的递归 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 文件来包装对mylib 的调用并提供特定于android 的内容;
- 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 文件提供了在构建中包含静态库作为预构建的规则。
我们使用LOCAL_EXPORT_C_INCLUDES 包含来自mylib 库的标头。
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 源的任何更改都将触发重建
包的。