Comment comstackr C dans un fichier binary exécutable et l’exécuter sous Android depuis Android Shell?

J’ai un appareil sur lequel j’ai installé Android Gingerbread 2.3.4 Ici, je veux exécuter un fichier exécutable C sur un appareil Android

Je suis capable d’exécuter l’application Android NDK sur Device et son exécution parfaite Mais je ne veux exécuter qu’un seul fichier exécutable hello.c sur Device.

 /* #includes #defines ... */ int main(){ // Do something when this is executed return 0; } 

Y at-il un moyen de comstackr ce fichier avec la chaîne d’outils Android NDK et nous pouvons exécuter l’exécutable de ce fichier

J’ai trouvé une chose ici mais cela ne fonctionne pas pour moi Android NDK, Revision 7b de Linux Il n’y a pas de structure de répertoire comme celle-ci

Tout d’abord, permettez-moi de dire que ma réponse dépend de votre utilisation de NDK r7b (cela fonctionnera également pour r7c) sous Linux (modifiez les chemins de manière appropriée pour d’autres systèmes).

Edit: Dernier test avec NDK r8e sur Linux et Nexus 4 avec adb de SDK Platform-Tools Rev 18 sur Windows 7 (dernier en date du 2013-07-25) sans access root .

Yet Another Edit: Veuillez lire cette question pour modifier mes instructions pour les fichiers binarys natifs devant fonctionner sous Android 5.0 (Lollypop) et versions ultérieures.

  1. Accédez à $NDK_ROOT (le dossier le plus haut du fichier zip NDK lorsqu’il est décompressé).
  2. Copiez le $NDK_ROOT/samples/hello-jni tant que $NDK_ROOT/sources/hello-world .
  3. Accédez à $NDK_ROOT/sources/hello-world .
  4. Modifiez AndroidManifest.xml pour donner à l’application un nom approprié (ceci est facultatif).
  5. Allez dans $NDK_ROOT/sources/hello-world/jni . C’est où le code source est.
  6. Modifiez hello-jni.c , supprimez tout le code et insérez votre code hello world . Le mien est:
      #comprendre 
     int main (int argc, char * argv [])
     {
         printf ("Bonjour tout le monde!");
         retourne 0;
     } 
  7. Modifiez Android.mk et modifiez la ligne include $(BUILD_SHARED_LIBRARY) pour include $(BUILD_EXECUTABLE) . Vous pouvez également modifier la ligne LOCAL_MODULE par le nom que vous voulez pour votre exécutable (par défaut, hello-jni )
  8. Revenez à $NDK_ROOT/sources/hello-world
  9. Exécutez ../../ndk-build pour créer l’exécutable.
  10. Copiez-le de $NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni dans /data/local/tmp sur le périphérique Android et modifiez ses permissions sur 755 (rwxr-xr-x). Si vous avez modifié la ligne LOCAL_MODULE dans $NDK_ROOT/sources/hello-world/jni/Android.mk , le nom de l’exécutable sera la nouvelle valeur de LOCAL_MODULE au lieu de hello-jni . (Tout cela se fait via adb depuis le SDK Android.)
  11. Exécutez le binary avec le chemin d’access complet sous la forme /data/local/tmp/hello-jni , ou tout ce que vous avez nommé.

Et vous avez terminé (et libre de commencer la documentation dans $ NDK_ROOT / docs pour avoir une meilleure idée de ce qu’il faut faire).

Le meilleur endroit pour placer un exécutable est / data / local . Vous devrez également chmod le binary en tant qu’exécutable. Vous aurez souvent besoin de le faire en deux étapes pour obtenir le binary de /sdcard/ vers /data/local :

 $ adb push mybin /sdcard/ $ adb shell $ cp /sdcard/mybin /data/local/mybin $ cd /data/local $ chmod 751 mybin 

Mises en garde :

  • Tous les systèmes n’ont pas de cp . Vous pouvez utiliser cat si c’est le cas:

    $ cat /sdcard/mybin > /data/local/mybin

  • Certains systèmes n’autorisent pas l’écriture /data/local pour l’utilisateur “shell”. Essayez /data/local/tmp

J’ai récemment eu le même problème sur un nouveau Nexus-5. Je voudrais append que / data / local n’a pas été accessible en écriture par l’utilisateur (“shell”, uid 2000) avec le shell adb. Mais mettre l’exécutable dans le sous-répertoire / data / local / tmp / a bien fonctionné.

l’emplacement “/ sdcard” n’est pas exécutable, ce qui signifie que tout fichier n’est pas exécutable du tout.

la seule façon d’exécuter “adb push” serait de les placer dans “/ data / local”, qui devrait être accessible en écriture pour adb, et permettre l’exécution à quiconque.

En un mot,

Tout d’abord, pour comstackr votre code C à partir de votre ordinateur hôte, utilisez la chaîne d’outils NDK avec l’option sysroot et l’option indépendante de la position -fPIE -pie .

 $NDKROOT/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-gcc \ --sysroot=$NDKROOT/platforms/android-22/arch-arm64 -fPIE -pie main.c -o main 

la partie arch arrch64 ou arch-arm64 , la version toolchain partie 4.9 , la version plateforme partie android-22 et le format binary de votre machine hôte darwin-x86_64 peuvent varier selon votre environnement.

Deuxièmement, placez votre fichier binary sous /data/local/tmp et exécutez-le à partir adb shell .