Как запустить пользовательское правило в Android.mk перед компиляцией?

В Android NDK я создаю файлы JNI, созданные автоматически SWIG. 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-источниках, я считаю, что после установки 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 никогда не называется.

  1. Для чего используется LOCAL_INTERMEDIATE_TARGETS?
  2. Могу ли я достичь того, что я хочу сделать здесь, не написав внешний скрипт или make-файл?

Я бы предложил следующее:

 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 удалит файл оболочки после сборки, если он не существовал до сборки.

Я сделал это так: допустим, мне нужно создать файл .s из файла .ll

 # custom build source_ll_files := $(wildcard *.ll) %.s: llc -o $@ $(patsubst %.s,%.ll,$@) LOCAL_SRC_FILES += $(patsubst %.ll,%.s,$(source_ll_files)) # end 
Intereting Posts
Ошибка установки: Неизвестная ошибка Android-приложения Подчеркивание поля ввода при наборе текста Как создать PDF-файл с несколькими страницами из файла изображения в android Учебник NFC для Android, отличный от API-демонстрации Курсор: неверный оператор в "fillWindow ();" Как установить высоту ячейки GridView на основе высоты экрана? Что такое хороший способ отслеживать фоновые события в Android без раздувания номеров сеансов? Android ListView выделяет несколько элементов Продажа электронных книг в android с использованием опции paypal? На Android, как долго я должен отвечать (и на что?), Прежде чем быть убитым? Можно ли принудительно установить EULA во время установки Android-приложения? Почему моя служба не работает в Android? (Я просто хочу, чтобы что-то регистрировалось каждые 5 секунд) Экспериментальный плагин Android Instant Run Gradle Как программно настроить фокус на виджет кнопки? Экранные прокрутки во время ввода с помощью JQTouch в приложении Android PhoneGap?