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.mkAndroid.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. 外部スクリプトやメイクファイルを書かずに、ここでやりたいことを達成できるでしょうか?
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. ndk-build.PHONYを実行するたびにカスタム アクションが実行されることを保証するために、ファイルを指定します。しかし、どれが の実際の依存関係であるかがわかっている場合は、代わりにそれらを次のように指定できます。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 に答える