Comment exécuter une règle personnalisée dans Android.mk avant la compilation?

Dans Android NDK, je crée des fichiers JNI générés automatiquement par SWIG. Callmanager_wrap.cpp fait partie d'une bibliothèque partagée:

LOCAL_SRC_FILES += callmanager_wrap.cpp include $(BUILD_SHARED_LIBRARY) 

Mais j'aimerais ajouter / éditer callmanager_wrap.cpp avant de compiler. Pour être plus explicite:

  • Utilisation de l'architecture Android?
  • Impossible de créer 2.3.3 Intel Atom AVD (userdata.img non trouvé)
  • Démarrer / lancer de manière programmée une connexion VPN
  • Ordre de rendu incorrect pour le bouton lorsque le thème matériel est appliqué
  • Android ne peut pas enregistrer de vidéo avec Front Front Camera, le démarrage de MediaRecorder a échoué: -19
  • Règles de connexion persistante de socket Android
  •  cat jnistuff.txt >> callmanager_wrap.cpp 

    Le contenu que je dois ajouter est connu à l'avance mais callmanager_wrap.cpp n'est pas . Il est généré par SWIG. En fin de compte, ma règle personnalisée devra exécuter la commande suivante pour générer callmanager_wrap.cpp:

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

    Selon cette publication , il n'est pas possible d'ajouter des règles personnalisées à Android.mk . Mais dans les sources Android, je crois qu'il y a quelques étapes de gestion Android.mk après CONSTRUCTION ou INSTALLÉ. J'ai essayé ce qui suit:

     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) 

    Mais myjni target n'est jamais appelé.

    1. À quoi sert LOCAL_INTERMEDIATE_TARGETS?
    2. Puis-je réaliser ce que je veux faire ici sans écrire un script externe ou makefile?

  • Comment les utilisateurs / développeurs peuvent-ils définir la configuration proxy Android pour les versions 2.x?
  • Lint se plaint de non traduit gcm_defaultSenderId chaîne
  • Pourquoi getApplicationContext (). SetTheme () dans une Activité ne fonctionne pas?
  • Une bonne stratégie pour déboguer cela?
  • Impossible de trouver des informations sur le fournisseur pour 'ContentProvider'
  • Comment puis-je obtenir un événement onclic sur la visualisation web dans Android?
  • 2 Solutions collect form web for “Comment exécuter une règle personnalisée dans Android.mk avant la compilation?”

    Je suggérerais ce qui suit:

     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) 

    C'est tout.

    Je vous dois certainement des explications. Alors, nous allons:

    1. $(LOCAL_SRC_FILES) est une liste de noms de fichiers par rapport à $(LOCAL_PATH) , afin d'adresser un fichier en dehors des actions NDK standard, vous avez besoin du chemin complet pour votre fichier, qui est $(LOCAL_PATH)/callmanager_wrap.cpp .

    2. Nous .PHONY le fichier comme .PHONY pour garantir que l'action personnalisée soit exécutée chaque fois que vous exécutez ndk-build . Mais si vous savez quelles sont les dépendances réelles de callmanager_wrap.cpp , vous pouvez les spécifier à la place, comme

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

      Dans ce cas, vous n'aurez pas besoin de la ligne .PHONY .

    3. Si vous souhaitez que votre répertoire source reste propre, vous pouvez déclarer le fichier wrapper comme .INTERMEDIATE comme ceci:

      .INTERMEDIATE: $(MY_JNI_WRAP)

    Maintenant, effacez le fichier wrapper après la construction, s'il n'existait pas avant la construction.

    Je l'ai fait de cette façon: disons que j'ai besoin de créer un fichier .s à partir du fichier .ll

     # custom build source_ll_files := $(wildcard *.ll) %.s: llc -o $@ $(patsubst %.s,%.ll,$@) LOCAL_SRC_FILES += $(patsubst %.ll,%.s,$(source_ll_files)) # end 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.