2011-04-27 38 views
7

我想建立一个静态库,使用最新的Android NDK(r5),我没有任何运气。我已经能够毫无问题地构建和运行示例(例如HelloJni),但从“从头开始”开始一个新项目已经是另一回事了。如何为NDK静态库编写/调试Android.mk?

对于这个实验,我试图构建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子项目。根/ 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,建立什么也不做,甚至后NDK,建立清洁)。详细运行(ndk-build V = 1)会显示一些rm -f调用(删除不存在的文件夹),但与项目或子项目无关。

我对这个构建脚本失败的原因很感兴趣,但这个过程应该是微不足道的,所以我确信它没有什么太有趣的地方。我对如何开始自己攻击构建错误更感兴趣。在上面的脚本中回声调用从来没有打 - 我不知道如何确定什么值或为什么它跳过子项目。有没有人找到一种方法来知道构建系统是试图用来做什么?

我也有兴趣知道这些工具是否有文档,或者它是否只是NDK文档文件夹中的一小部分文本文件?我一直在试图通过复制我从Google搜索中发现的随机Android.mk的部分来解决这个问题,但是只有简单的NDK示例中使用的几个命令似乎被记录下来,所以这些经验实际上只是提出了新的问题。

回答

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) 

它内置了两个libpng.a和libpng2。所以在obj/local/armeabi文件夹中。我猜测它不会建立一个静态库,如果没有依赖。

+0

谢谢。我已经尝试过,并没有改变任何行为(ndk-build仍然是一个无操作)。我也尝试删除LOCAL_C_INCLUDES,因为我不知道为什么会被使用。没有运气。这听起来像你在暗示我使用eclipse来生成这个mk文件?我不知道你可以这样做。我可能能够使用它而不是关于如何调试.mk文件的说明。你能指点我怎么做的吗? – Dave 2011-04-27 23:28:41

+0

奇怪:对不起,没有工作。原始的参考文件是手工生成的,但由Eclipse构建,除非我记错。我会实际尝试自己构建它。有一点需要注意:如果你在Windows上这样做,你必须确保你的路径中没有空格,不管怎么样,或者在十多年后,Cygwin STILL不能正确处理空格(不是视觉工作室ddk做了一个粉碎的工作,所以这可能只是Windows吸吮风)。 – Femi 2011-04-27 23:49:33

+0

我将尝试报废我的文件夹结构并逐字使用您的文件。但是关于如何调试这些.mk文件的原始问题仍然存在。 仅供参考,我在Mac上... – Dave 2011-04-27 23:55:44

1

在过去的两个小时里,我一直在为这个问题而头疼,这篇文章帮助解决了这个问题。与其添加虚拟依赖关系,不如简单地调用ndk-build(这仅仅是一个简单的封装)作为“ndk-build png”。

0

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

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

帮助我的是将APP_MODULES行添加到我的Application.mk中,如Cannot build static library with Android NDK R8中所述。无论如何,你可能需要一个Application.mk,因为它包含了对你的静态lib非常重要的其他设置,如APP_STL,APP_PLATFORM,APP_ABI等。