2015-07-22 3 views
1

J'ai trouvé un certain nombre de bons tutoriels sur la compilation de code d'assemblage avec Android NDK. Mais ils n'ont pas d'informations sur la façon d'appeler les instructions d'assemblage à partir de fichiers source C, ce qui est possible, je crois. Je pense avoir vu des tutoriels similaires en ligne. Ma question est si je peux avoir un fichier source C, qui émet des appels d'assemblage. Je veux aussi pouvoir compiler avec NDK. Mais j'aime éviter d'utiliser Android Studio et JNI; une raison étant que je n'ai pas de code Java. Et j'ai déjà validé que je peux compiler et exécuter des fichiers source C en utilisant NDK. Donc, fondamentalement, je sais comment compiler les fichiers source C, et les fichiers d'assemblage en utilisant NDK. J'ai validé que le code C fonctionne bien sur mon téléphone. Mais je ne suis pas sûr de savoir comment appeler les instructions d'assemblage à partir des fichiers sources C pour l'architecture des bras. Je continue à recevoir le message d'erreur suivant lorsque je tente de compiler un simple fichier source: sembleComment appeler l'assemblage de bras à partir de fichiers source C?

#include <stdio.h> 

__asm__(" smC#0"); 

int main(void) 
{ 
    /*Do something*/ 
    return 0; 
} 

La question, par ailleurs, ne pas être le pouce vs:

/tmp/ccwua4Gd.s: Assembler messages: 
/tmp/ccwua4Gd.s:18: Error: selected processor does not support Thumb mode `smC#0' 

Voici le fichier lié aux bras. J'ai essayé LOCAL_ARM_MODE := arm déclaration dans mon Android.mk, mais il n'a rien résolu. Je viens d'obtenir l'erreur similaire pour l'instruction ARM.

Mise à jour: j'obtiens toujours cette erreur. Voici une copie de mon Android.mk Je n'avais pas besoin de spécifier la version du bras ou la spécification bras/pouce dans un fichier source C précédent afin de l'exécuter sur le périphérique. J'ai lu sur le pouce et les avantages et les inconvénients associés à l'option, et comment spécifier le soutien pour cela. Cette erreur persiste cependant même quand je mets en configuration l'ABI. La seule chose que je n'ai pas essayée est d'ajouter l'extension .arm à mes fichiers source C. J'ai vu une référence à ce sujet dans un post précédent, et je ne pouvais pas comprendre pourquoi cela ferait une différence. Je crois que le PO, dans ce fil, impliquait que cela corrigerait l'erreur. Quelqu'un peut-il élaborer à ce sujet? Est-ce que quelqu'un l'a utilisé? Quel est l'effet de faire cela par rapport aux déclarations Android.mk pertinentes à l'architecture? Merci

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := hello 
APP_ABI := armeabi-v7a 
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.c) 
$(warning here is what is in FILE_LIST after an attempt to collect all the C files$(FILE_LIST)) 
FILE_LIST += $(wildcard $(LOCAL_PATH)/*.s) 
$(warning here is what is in FILE_LIST after an attempt to collect all the S files$(FILE_LIST)) 
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) 
include $(BUILD_EXECUTABLE) 

Une autre mise à jour - j'ai essayé d'ajouter le suffixe .arm à mes fichiers source C changement foo.c à foo.c.arm, mais même cela n'a pas abordé la question. Toute aide est grandement appréciée. Voici ce que je fais maintenant dans mon dossier Android.mk:

FILE_LIST := $(patsubst %.c,%.c.arm,$(wildcard $(LOCAL_PATH)/*.c)) 

Voici une version mise à jour de l'erreur. Il change juste le mot « pouce » à « bras »

/tmp/ccTK9siq.s: Assembler messages: 
/tmp/ccTK9siq.s:17: Error: selected processor does not support ARM mode `smC#0' 

Hé, je fait un peu plus de recherche, et a trouvé lien this à propos de mon problème. J'ai mis à jour mon fichier Android.mk avec LOCAL_CFLAGS := -mcpu=cortex-a8 comme indiqué dans la page. Le problème n'a pas disparu, mais j'ai reçu un message informatif indiquant: warning: switch -mcpu=cortex-a8 conflicts with -march=armv5te switch [enabled by default] Donc les commandes suggérées ci-dessous n'ont pas vraiment pris effet. Est-ce que quelqu'un sait si je devrais essayer de changer les paramètres par défaut de ndk-build et comment? Après tout, c'est un avertissement. pas une erreur. Donc, je ne suis pas sûr si cela a pris ma configuration ou si je dois faire autre chose. Aussi maintenant je reçois une erreur à propos de l'absence du seul fichier d'en-tête, stdio.h, que je ne recevais pas auparavant. Ce genre de me dit que ndk-build vient de passer le processus de construction à faire après cet avertissement. Quelqu'un peut-il fournir des conseils ou une solution à cela?

073015 mise à jour - J'ai réalisé qu'il y avait une différence entre application.mk et Android.mk. Après avoir configuré l'application.mk avec les paramètres indiqués, j'ai pu changer l'architecture en armv7-a mais j'ai la même erreur; regardez ci-dessous:

jni/Android.mk:6: This is in NDK_ROOT /home/sansari/android/android-ndk-r10d 
[armeabi-v7a] Assembly  : hello_tz <= main_normal.filtered.s 
./obj/local/armeabi-v7a/objs-debug/hello_tz/main_normal.filtered.s: Assembler messages: 
./obj/local/armeabi-v7a/objs-debug/hello_tz/main_normal.filtered.s:16: Error: **selected processor does not support ARM mode `smC#0'** 
make: *** [obj/local/armeabi-v7a/objs-debug/hello_tz/main_normal.o] Error 1 

Y at-il autre config que je dois faire pour obtenir la fonctionnalité que je veux?

+0

de http://infocenter.arm.com/help/topic/com.arm.doc.dui0489c/Cjaeeged.html> Section SMC "Architectures" Cette instruction ARM est disponible dans les implémentations d'ARMv6 et au-dessus, si elles ont les extensions de sécurité. Cette instruction Thumb 32 bits est disponible dans les implémentations de ARMv6T2 et supérieures, si elles ont les extensions de sécurité. Il n'existe pas de version Thumb 16 bits de cette instruction. – Toris

+0

J'ai lu la spécification d'armement de l'instruction SMC. Mis à part ce que Larry mentionné ci-dessous, et ce que j'ai à faire, je dois faire quelque chose de différent dans ma source C ou Android.mk? – user3326293

+0

Toris- S'il vous plaît regarder ma dernière mise à jour. Même armeabiv7a ne supporte pas l'appel smc. – user3326293

Répondre

1

Le problème est que vous injectez un assembly pour ARMv6 ou supérieur. Si vous ne spécifiez pas l'ABI dans votre application NDK.mk, les outils supposent ARMv5.

+0

Pour spécifier quel (s) ABI (s) générer, définissez 'APP_ABI' dans [Application.mk] (https://developer.android.com/ndk/guides/application_mk.html) (par exemple' APP_ABI: = armeabi-v7a ') – Michael

+0

J'ai changé l'architecture; mais même armeabiv7-a ne supporte pas les extensions de sécurité. Voudriez-vous regarder mes derniers messages d'erreur? Pourrait-il y avoir une autre variable que j'ai besoin de configurer dans Application.mk ou Android.mk pour obtenir ceci? – user3326293

+0

Non, en général, le compilateur NDK n'est pas conçu pour créer des applications natives autonomes. Android s'attend à ce que toutes les applications s'exécutent dans l'environnement d'exécution (Java). Il n'est donc pas surprenant que le compilateur soit limité dans le type d'extensions qu'il supporte. –