如何为NDK静态库编写/调试Android.mk?

时间:2011-04-27 21:47:16

标签: android android-ndk

我正在尝试使用最新的Android NDK(r5)构建一个静态库,我没有运气。我已经能够构建和运行示例(例如,HelloJni)而没有任何问题,但是从'scratch'开始一个新项目是一个不同的故事。

对于这个实验,我正在尝试构建libpng。我的文件夹结构如下所示:

root
|
+--- jni
      |
      +---- Android.mk ( one line: "include $(call all-subdir-makefiles)" )
      |
      +---- png
             |
             +---- Android.mk ( see below )
             |
             +---- { a bunch of .c and .h files )

所以我有两个Android.mks。一个用于构建所有子项目,另一个用于libpng子项目。 root / jni / png / Android.mk看起来像这样:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := png
MODULE_PATH := $LOCAL_PATH
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.c)
LOCAL_C_INCLUDES := $(wildcard $(LOCAL_PATH)/*.h)

LOCAL_INTERMEDIATE_TARGETS += junk
junk:
    echo $(LOCAL_SRC_FILES)

include $(BUILD_STATIC_LIBRARY)

这个构建设置似乎什么都不做(即,即使在ndk-build清理之后,从根文件夹运行ndk-build也不会做任何事情)。详细运行(ndk-build V = 1)显示了一些rm -f调用(删除不存在的文件夹),但没有与项目或子项目相关的任何内容。

我对这个构建脚本失败的原因很感兴趣,但是这个过程应该是微不足道的,所以我确定它没有什么特别有趣的。我对如何开始自己攻击构建错误更感兴趣。上面脚本中的echo调用永远不会被命中 - 我不知道如何确定它是什么值或者为什么它会跳过子项目。有没有人找到方法知道构建系统尝试做什么?

我也有兴趣知道这些工具是否有文档,或者它是否只是NDK文档文件夹中的少数几个文本文件?我一直试图通过复制随机Android.mk来解决这个问题,我发现它是通过谷歌搜索发现的,但只有简单的NDK样本中使用的少数几个命令似乎都有记录,所以这种体验实际上只是提出了新的问题。 / p>

3 个答案:

答案 0 :(得分:9)

我建议摆脱MODULE_PATH而不是尝试使用通配符:我还没有真正看到这项工作。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := png
LOCAL_SRC_FILES := pngget.c pngread.c pngrutil.c pngtrans.c pngwtran.c png.c pngmem.c pngrio.c pngset.c pngwio.c pngwutil.c pngerror.c pngpread.c pngrtran.c pngwrite.c
LOCAL_C_INCLUDES := png.h pngconf.h pngpriv.h

include $(BUILD_STATIC_LIBRARY)

此外,还有一些严重的路径魔法我还没有完全解读:不知何故Eclipse做了正确的事情,但让它从命令行跳过正确的箍仍然是我的命中或错过。

编辑:因为我玩NDK已经有一段时间了,所以对于解决这个问题有点兴趣。当我使用原始文件时它没有编译,但是当我将png源代码放在目录jni中然后使用这个Android.mk文件时:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := png
LOCAL_SRC_FILES := pngget.c pngread.c pngrutil.c pngtrans.c pngwtran.c png.c pngmem.c pngrio.c pngset.c pngwio.c pngwutil.c pngerror.c pngpread.c pngrtran.c pngwrite.c
LOCAL_C_INCLUDES := png.h pngconf.h pngpriv.h

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := png2
LOCAL_STATIC_LIBRARIES := png

include $(BUILD_SHARED_LIBRARY)

它在obj / local / armeabi文件夹中构建了libpng.a和libpng2.so。我猜测如果没有依赖,它就不会构建静态库。

答案 1 :(得分:1)

在过去的两个小时里,我一直在为这个问题打败自己,这篇文章帮助解决了这个问题。而不是添加虚拟依赖项,只需调用ndk-build(这只是make的一个瘦包装)为“ndk-build png”。

答案 2 :(得分:0)

我发现当我在编辑中添加了一个“虚拟”共享库时,.a(我在obj /中发现,暗示它是一个内部细节)不包含任何.o文件我想要的。

此外,.so重新编译了为静态库构建的所有文件。所以.a是空的是有意义的。

帮助我的是将APP_MODULES行添加到我的Application.mk中,如Cannot build static library with Android NDK R8中所述。你可能还想要一个Application.mk,因为它包含对你的静态库很重要的其他设置,比如APP_STL,APP_PLATFORM,APP_ABI等。