gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:41:51 26 4
gpt4 key购买 nike

我正在尝试使用最新的 Android NDK (r5) 构建静态库,但我没有任何运气。我已经能够毫无问题地构建和运行示例(例如,HelloJni),但是从“零”开始一个新项目是另一回事。

对于这个实验,我正在尝试构建 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)

这个build设置似乎什么都不做(即从根文件夹运行 ndk-build 什么也不做,即使在 ndk-build clean 之后)。详细运行 (ndk-build V=1) 显示一些 rm -f 调用(删除不存在的文件夹)但与项目或子项目无关。

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

我也想知道是否有这些工具的文档,或者它是否只是 NDK 文档文件夹中的少数文本文件?我一直在尝试通过复制我在谷歌搜索中发现的随机 Android.mk fragment 来解决这个问题,但似乎只记录了简单 NDK 示例中使用的少数命令,因此这种体验实际上提出了新问题。

最佳答案

我建议摆脱 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。我猜如果没有依赖关系,它根本不会构建静态库。

关于android - 如何为 NDK 静态库编写/调试 Android.mk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5811009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com