0

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

目前,如果我离线运行我的脚本来生成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开始,但这是一个丑陋的黑客。

4

1 回答 1

0

找到了一个黑客——更好的方法?

我发现了一个黑客。NDK 中的 makefileprebuilt-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-shared-library.mk我引用了我的副本prebuilt-library.mk)并注释掉这些行以停止错误。然后诀窍是使一些首先评估的目标取决于我要生成的文件。在挖掘了 NDK 中的 .mk 脚本后,我发现它libraries可以达到目的。通过添加libraries: $(LOCAL_PATH)/libmy_so.soAndroid.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 一起成熟,但它确实可以解决问题。仍然对更优雅的解决方案感兴趣。

于 2016-04-03T07:55:45.160 回答