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.
$NDK_ROOT
(le dossier le plus haut du fichier zip NDK lorsqu’il est décompressé). $NDK_ROOT/samples/hello-jni
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 où le code source est. 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; }
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
) $NDK_ROOT/sources/hello-world
../../ndk-build
pour créer l’exécutable. $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.) /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 plate – forme 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
.