【问题标题】:Android.mk PREBUILT_SHARED_LIBRARY how to generate LOCAL_SRC_FILES file from script?Android.mk PREBUILT_SHARED_LIBRARY 如何从脚本生成 LOCAL_SRC_FILES 文件?
【发布时间】:2016-04-03 03:42:33
【问题描述】:

我有一个 NDK 项目,我在其中使用交叉编译器和标准 gnu make utils 构建共享库。这是通过单独的脚本完成的。但是为了在我的项目中使用库,我希望我的Android.mk 进程调用我的脚本以生成尚未构建的共享库,然后让Android.mk 使用@987654324 包装它@进程。

目前,如果我离线运行我的脚本来生成libmy_so.so,那么下面的makefile 将起作用。但是,如果我不先显式运行脚本,则会收到以下错误:

Android NDK: ERROR:/path_to_project/Android.mk:my_module: LOCAL_SRC_FILES points to a missing file

而且我的脚本永远不会被调用,因此在尝试解决依赖关系之前,make 过程就失败了。

include $(CLEAR_VARS)

LOCAL_MODULE        := my_module
LOCAL_SRC_FILES     := libmy_so.so
LOCAL_EXPORT_CFLAGS := # some stuff
LOCAL_EXPORT_LDLIBS := # some stuff
$(LOCAL_PATH)/libmy_so.so:
    echo "generate file"
    $(shell run_script_that_creates_libmy_so.so)

include $(PREBUILT_SHARED_LIBRARY)

有没有一个干净的解决方案?我什至可以自动运行脚本作为预处理步骤(如果文件已经存在,我总是可以让我的脚本安静地退出),但我还没有找到允许LOCAL_SRC_FILES 变量指向不存在的咒语文件。我考虑过放置一个虚拟的 libmy_so.so 来开始,但这是一个丑陋的 hack。

【问题讨论】:

  • 我认为你应该在 build.gradle 中配置 ndk,让一个依赖于它的需要。
  • 我不能直接使用 build.gradle 来实现这一点,因为我正在创建一个可扩展的工具,它可以让使用 NDK 更容易。请参阅this project 以了解我想要做什么。

标签: android makefile android-ndk ndk-build


【解决方案1】:

找到了破解方法——更好的方法?

我发现了一个黑客。 NDK 中的 makefile prebuilt-library.mk 包含以下几行:

ifndef prebuilt
$(call __ndk_info,ERROR:$(LOCAL_MAKEFILE):$(LOCAL_MODULE): LOCAL_SRC_FILES points to a missing file)
$(call __ndk_info,Check that $(prebuilt_path) exists, or that its path is correct)
$(call __ndk_error,Aborting)
#endif

我创建了这个文件的副本(以及我引用了我的 prebuilt-library.mk 副本的 prebuilt-shared-library.mk)并注释掉这些行以阻止错误。然后诀窍是使一些首先评估的目标取决于我要生成的文件。在挖掘了 NDK 中的 .mk 脚本后,我发现libraries 可以达到目的。通过将libraries: $(LOCAL_PATH)/libmy_so.so 添加到Android.mk,它最终会做我想要的。

include $(CLEAR_VARS)

LOCAL_MODULE        := my_module
LOCAL_SRC_FILES     := libmy_so.so
LOCAL_EXPORT_CFLAGS := # some stuff
LOCAL_EXPORT_LDLIBS := # some stuff
$(LOCAL_PATH)/libmy_so.so:
    echo "generate file"
    $(shell run_script_that_creates_libmy_so.so)
libraries: $(LOCAL_PATH)/libmy_so.so

include /path/to/my/mk/files/prebuilt-shared-library.mk

这显然不太理想,因为我想确保我的 makefile 在更新版本的 NDK 中成熟,但它确实可以解决问题。仍然对更优雅的解决方案感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多