web-dev-qa-db-fra.com

Comment compiler C dans un fichier binaire exécutable et l'exécuter dans Android from Android Shell?

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

Je suis capable d'exécuter Android Application NDK sur l'appareil et son exécution parfaite, mais je ne veux exécuter qu'une seule hello.c fichier exécutable sur l'appareil.

/* #includes #defines ... */

int main(){
    // Do something when this is executed
    return 0;
}

Existe-t-il un moyen de compiler ce fichier avec Android NDK chaîne d'outils et nous pouvons exécuter l'exécutable de ce fichier

J'ai trouvé une chose ici mais cela ne fonctionne pas pour moi j'utilise Android NDK, Revision 7b de linux Il n'y a pas de structure de répertoires comme celle-ci

42
user1089679

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 (changez les chemins de manière appropriée pour les autres systèmes).

Edit: Dernier test avec NDK r8e Sur Linux et Nexus 4 Avec adb à partir de SDK Platform-Tools Rev 18 sur Windows 7 (au plus tard le 25/07/2013) sans accès root .

Encore une autre modification: Veuillez lire cette question pour avoir modifié mes instructions pour les binaires natifs qui doivent fonctionner sur Android 5.0 (Lollypop) et versions ultérieures.

  1. Accédez à $NDK_ROOT (Le dossier le plus haut de NDK Zip lorsqu'il est décompressé).
  2. Copiez le répertoire $NDK_ROOT/samples/hello-jni En 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. Accédez à $NDK_ROOT/sources/hello-world/jni. C'est là que se trouve le code source.
  6. Modifiez hello-jni.c, Supprimez tout le code et insérez votre code hello world. Le mien est:
    #include 
     int main (int argc, char * argv []) 
     {
     printf ("Hello, World!"); 
     return 0; 
    }
  7. Modifiez Android.mk Et changez la ligne include $(BUILD_SHARED_LIBRARY) en include $(BUILD_EXECUTABLE). Vous pouvez également remplacer la ligne LOCAL_MODULE Par le nom que vous souhaitez pour votre exécutable (la valeur par défaut est 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 Vers /data/local/tmp Sur le Android et remplacez ses autorisations par 755 (rwxr-xr-x). Si vous avez modifié le 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 Android SDK.)
  11. Exécutez le binaire avec le chemin complet en tant que /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).

39
Samveen

L'endroit le meilleur/le plus facile pour mettre un exécutable est /data/local . Vous devrez également chmod le binaire comme exécutable. Souvent, vous devrez également effectuer cette opération en deux étapes pour obtenir le binaire de /sdcard/ à /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 cp. Vous pouvez utiliser cat si c'est le cas:

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

  • Certains systèmes n'autorisent pas l'écriture dans /data/local pour l'utilisateur "Shell". Essayez /data/local/tmp

24
NuSkooler

J'ai récemment eu le même problème sur un nouveau Nexus-5. Je voudrais ajouter que/data/local n'était pas accessible en écriture par l'utilisateur ("Shell", uid 2000) que j'ai obtenu avec adb Shell. Mais mettre l'exécutable dans le sous-répertoire/data/local/tmp/a bien fonctionné.

12
Niels Möller

l'emplacement "/ sdcard" n'est pas exécutable, ce qui signifie que tout fichier ne l'est pas du tout.

le seul moyen d'exécuter "adb Push" serait de les placer dans "/ data/local", qui devrait être accessible en écriture pour adb, et de permettre l'exécution pour n'importe qui.

11
dvhh

En un mot,

Tout d'abord, pour compiler de manière croisée votre code C à partir de votre machine 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

partie Archarrch64 ou Arch-arm64, le partie de la version de la chaîne d'outils4.9, partie de la version de la plateformeAndroid-22, et le format binaire pour votre machine hôtedarwin-x86_64 peut varier selon votre environnement.

Deuxièmement, poussez votre binaire sous /data/local/tmp et exécutez-le à partir de adb Shell.

4
9re