【发布时间】:2012-09-04 13:09:18
【问题描述】:
在 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
根据this post,无法给Android.mk添加自定义规则。但在 Android 资源中,我相信在 BUILT 或 INSTALLED 之后会有一些Android.mk 处理步骤。我尝试了以下方法:
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 目标永远不会被调用。
- LOCAL_INTERMEDIATE_TARGETS 有什么用途?
- 我是否可以在不编写外部脚本或 makefile 的情况下实现我想要在此处执行的操作?
【问题讨论】:
-
你能澄清这句话“我想在编译之前附加 callmanager_wrap.cpp”吗?如果你把它弄清楚一点,我可以帮你。
-
你真的需要在每个构建中运行 swig 吗?
-
一方面,它更干净并且可以防止对生成的文件进行版本控制。另一方面,如果开发人员在
git rebase之后没有make clean,则不对这些文件进行版本控制可能会破坏构建。但这是开发人员的问题。是不是可以自定义 android makefile 到那种程度?我不会隐瞒我正在考虑编写一个顶级脚本来做到这一点,但我仍然对这个 android 限制感到好奇。
标签: android android-ndk makefile