如何在编译之前在Android.mk运行自定义规则? [英] How to run custom rule in Android.mk before compilation?

查看:1576
本文介绍了如何在编译之前在Android.mk运行自定义规则?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  LOCAL_SRC_FILES + = callmanager_wrap.cpp
包括$(BUILD_SHARED_LIBRARY)
 

不过,我想在编译之前追加/编辑 callmanager_wrap.cpp 。为了更明确的:

 猫jnistuff.txt>> callmanager_wrap.cpp
 

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

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

根据这个帖子,这是不可能添加自定义规则 Android.mk 。但在Android的来源,我相信有建成或在安装后一定 Android.mk 处理步骤。我试过如下:

  MY_JNI_WRAP = callmanager_wrap.cpp

包括$(CLEAR_VARS)

LOCAL_SRC_FILES + = callmanager_wrap.cpp

LOCAL_INTERMEDIATE_TARGETS + = myjni
myjni:
    回声,在myjni目标
    痛饮-c ++ -java -package com.package.my -o $(MY_JNI_WRAP)callmanager.i
    猫jnistuff.txt>> $(MY_JNI_WRAP)

包括$(BUILD_SHARED_LIBRARY)
 

myjni 目标永远不会被调用。

  1. 在使用何种LOCAL_INTERMEDIATE_TARGETS呢?
  2. 我都不可能达到我想要在这里做,而无需编写外部脚本或Makefile的?
解决方案

我建议如下:

 包括$(CLEAR_VARS)

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

$(MY_JNI_WRAP):
    回声,在myjni目标
    痛饮-c ++ -java -package com.package.my -o $(MY_JNI_WRAP)callmanager.i
    猫jnistuff.txt>> $(MY_JNI_WRAP)
.PHONY:$(MY_JNI_WRAP)

包括$(BUILD_SHARED_LIBRARY)
 

就是这样。

我大概欠你一些解释。所以在这里我们去:

  1. $(LOCAL_SRC_FILES)是文件名相对于 $(LOCAL_PATH),所以名单从标准NDK行动之外地址的文件,你需要完整的路径为您的文件,这是 $(LOCAL_PATH)/callmanager_wrap.cpp

  2. 我们该文件设置为 .PHONY ,以保证自定义操作每次运行的 NDK建造的时间执行。但如果你知道这是 callmanager_wrap.cpp 的实际依赖关系,而是可以指定它们,就像

    $(MY_JNI_WRAP):callmanager.i jnistuff.txt $(LOCAL_PATH)/../ SRC / COM /封装/我/ Something.java

    在这种情况下,你不会需要 .PHONY 行。

  3. 如果你希望你的源代码目录保持干净,你可以声明封装文件作为 .INTERMEDIATE 是这样的:

    .INTERMEDIATE:$(MY_JNI_WRAP)

现在将删除生成后的封装文件,如果构建之前并不存在的。

In Android NDK, I build JNI files generated automatically by SWIG. callmanager_wrap.cpp is part of a shared library:

LOCAL_SRC_FILES += callmanager_wrap.cpp
include $(BUILD_SHARED_LIBRARY)

But I would like to append/edit callmanager_wrap.cpp before compiling. To be more explicit:

cat jnistuff.txt >> callmanager_wrap.cpp

Content I need to add is known in advance but callmanager_wrap.cpp is not. It is generated by SWIG. Ultimately, my custom rule will have to run following command to generate callmanager_wrap.cpp:

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

According to this post, it is not possible to add custom rules to Android.mk. But in Android sources, I believe there are some Android.mk handling steps after BUILT or INSTALLED. I tried the following:

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)

But myjni target is never called.

  1. What is LOCAL_INTERMEDIATE_TARGETS used for?
  2. Can I possibly achieve what I want to do here without writing an external script or makefile?

解决方案

I would suggest the following:

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)

That's it.

I probably owe you some explanations. So here we go:

  1. $(LOCAL_SRC_FILES) is a list of file names relative to $(LOCAL_PATH), so to address a file from outside the standard NDK actions, you need the full path for your file, which is $(LOCAL_PATH)/callmanager_wrap.cpp.

  2. We specify the file as .PHONY to guarantee that the custom action is executed every time you run ndk-build. But if you know which are actual dependencies of callmanager_wrap.cpp, you can specify them instead, like

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

    In this case, you will not need the .PHONY line.

  3. If you want your source directory to remain clean, you can declare the wrapper file as .INTERMEDIATE like this:

    .INTERMEDIATE: $(MY_JNI_WRAP)

Now make will delete the wrapper file after build, if it did not exist before the build.

这篇关于如何在编译之前在Android.mk运行自定义规则?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆