以下是翻译的结果:
这里有一个解决方案,可以从标准 Makefile 中构建外部库和 Android 应用程序包:
作为先决条件,您需要安装一切用于命令行 Android 开发所需的工具:
- 一个独立的工具链,请参阅 Android NDK 中附带的文档;
- ant。
示例的结构为:一个外部库目录和一个 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
文件来包装对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
< p >
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源码的更改都会触发包的重新构建。
config.h.in
生成config.h
是不可能的。然而,在本地运行配置可能会起作用,但那是另一回事 :). - Samveen