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
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.
$NDK_ROOT
(Le dossier le plus haut de NDK Zip lorsqu'il est décompressé).$NDK_ROOT/samples/hello-jni
En tant que $NDK_ROOT/sources/hello-world
.$NDK_ROOT/sources/hello-world
.AndroidManifest.xml
Pour donner à l'application un nom approprié (ceci est facultatif).$NDK_ROOT/sources/hello-world/jni
. C'est là que se trouve le code source.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; }
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
)$NDK_ROOT/sources/hello-world
../../ndk-build
Pour créer l'exécutable.$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.)/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).
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
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é.
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.
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
.