13

在 Android NDK 中,我构建了由 SWIG 自动生成的 JNI 文件。callmanager_wrap.cpp是共享库的一部分:

LOCAL_SRC_FILES += callmanager_wrap.cpp
include $(BUILD_SHARED_LIBRARY)

但我想callmanager_wrap.cpp在编译之前附加/编辑。更明确地说:

cat jnistuff.txt >> callmanager_wrap.cpp

我需要添加的内容是事先知道的,但 callmanager_wrap.cpp 不是。它由 SWIG 生成。最终,我的自定义规则必须运行以下命令来生成 callmanager_wrap.cpp:

swig -c++ -java -package com.package.my -o callmanager_wrap.cpp callmanager.i

根据这篇文章,无法将自定义规则添加到Android.mk. Android.mk但在 Android 资源中,我相信在 BUILT 或 INSTALLED 之后会有一些处理步骤。我尝试了以下方法:

MY_JNI_WRAP=callmanager_wrap.cpp

include $(CLEAR_VARS)

LOCAL_SRC_FILES += callmanager_wrap.cpp

LOCAL_INTERMEDIATE_TARGETS += myjni
myjni:
    echo "in myjni target"
    swig -c++ -java -package com.package.my -o $(MY_JNI_WRAP) callmanager.i
    cat jnistuff.txt >> $(MY_JNI_WRAP)

include $(BUILD_SHARED_LIBRARY)

但是myjni永远不会调用目标。

  1. LOCAL_INTERMEDIATE_TARGETS 是做什么用的?
  2. 我可以在不编写外部脚本或 makefile 的情况下实现我想要做的事情吗?
4

2 回答 2

9

我建议如下:

include $(CLEAR_VARS)

LOCAL_SRC_FILES += callmanager_wrap.cpp
MY_JNI_WRAP := $(LOCAL_PATH)/callmanager_wrap.cpp

$(MY_JNI_WRAP):
    echo "in myjni target"
    swig -c++ -java -package com.package.my -o $(MY_JNI_WRAP) callmanager.i
    cat jnistuff.txt >> $(MY_JNI_WRAP)
.PHONY: $(MY_JNI_WRAP)

include $(BUILD_SHARED_LIBRARY)

就是这样。

我可能欠你一些解释。所以我们开始:

  1. $(LOCAL_SRC_FILES)是相对于 的文件名列表$(LOCAL_PATH),因此要从标准 NDK 操作之外处理文件,您需要文件的完整路径,即$(LOCAL_PATH)/callmanager_wrap.cpp.

  2. 我们指定文件.PHONY以保证每次运行ndk-build时都会执行自定义操作。但是,如果您知道哪些是 的实际依赖项callmanager_wrap.cpp,则可以指定它们,例如

    $(MY_JNI_WRAP): callmanager.i jnistuff.txt $(LOCAL_PATH)/../src/com/package/my/Something.java

    在这种情况下,您将不需要该.PHONY线路。

  3. 如果你希望你的源目录保持干净,你可以.INTERMEDIATE像这样声明包装文件:

    .INTERMEDIATE: $(MY_JNI_WRAP)

现在make将在构建之后删除包装文件,如果它在构建之前不存在。

于 2012-09-12T07:28:57.427 回答
0

我是这样做的:假设我需要从 .ll 文件创建 .s 文件

# custom build
source_ll_files := $(wildcard *.ll)
%.s:
    llc -o $@ $(patsubst %.s,%.ll,$@)

LOCAL_SRC_FILES += $(patsubst %.ll,%.s,$(source_ll_files))
# end
于 2014-09-20T14:23:49.543 回答