2011-11-02 4 views
2

Je suis en train de porter un modem 3G écrit pour Linux pour les ordinateurs portables à un périphérique android (Gingerbread) intégré avec un processeur ARM. J'ai déjà compilé le pilote de périphérique (code C) en tant que module (fichier .ko) et installé. Je le vois quand je démarre le noyau et ça fonctionne bien. Il se connecte au port USB comme prévu. C'est heureux d'être parlé.migrer un pilote linux vers Android

La prochaine pièce requise est le "gestionnaire de connexion" écrit en C++. C'est là que j'ai un problème. Cela ne fonctionne pas dans l'espace noyau mais ce n'est pas une application Android standard avec une interface utilisateur. C'est une "tâche" exécutée en arrière-plan qui doit être démarrée à partir du fichier "init.rc" au démarrage. Le fichier makefile fourni avec le code source est bon pour définir les dépendances mais il est inutile jusqu'à la plate-forme que je veux cibler. J'utilise la chaîne d'outils fournie avec le code source Android "arm-eabi- *" (fonctionne sur une machine Unbuntu) que j'ai utilisé pour compiler Android et le noyau. J'ai eu beaucoup d'erreurs de compilation primaires car il utilise les bibliothèques "libc" standard qui n'existent pas sous Android. Je l'ai remplacé par le "bionic libc" qui est une version légère de sous-ensemble de linux libc pour android. En plus, il recherche "crt0.o" qui est le code de démarrage d'un programme lié statiquement dans un environnement Linux (et plusieurs autres systèmes d'exploitation). Dans Android, il est lié dynamiquement au moment de l'exécution, donc utilise autre chose que crt0.o.

Il y a des tonnes d'informations sur la programmation de l'application Android sur le Web, mais très peu sur ce genre de choses de bas niveau. Si quelqu'un a un fichier makefile qui fonctionne pour créer ce type de code C++ en tâche de fond sous Android ARM, j'apprécierais d'y jeter un coup d'oeil ou s'il y a des informations qui pourraient m'aider à trouver un moyen de le faire. Ou si quelqu'un a fait quelque chose comme ça pourrait me donner des indices sur la façon d'y parvenir.

+0

Google dispose d'un outil permettant d'intégrer du code C++ dans une application (NDK). C'est un pont entre le code Java et C++. Les documents que je peux trouver sont à peu près autour des applications et de l'interface utilisateur. Je ne suis pas sûr qu'il s'applique à ce que je veux faire parce qu'il génère des bibliothèques utilisées par le code Java. Dans le dossier Android "external /", j'ai trouvé un code source C++ intéressant gérant différentes choses de plusieurs fabricants. Il semble être construit par un système construit différent basé sur des fichiers "android.mk". Je vais mettre mon code là-bas et le prendre comme exemple et voir ce que j'en tire. Quelqu'un en sait plus à ce sujet? –

+0

Il y a plus de docs trouvés dans "build/core" Il commence par build-system.html et ANDROID-MK.html. Il n'est pas complet et pas à jour mais c'est un point de départ –

+0

Les documents HTML sont obsolètes. Mais si vous commencez avec le "Makefile" dans le dossier principal du projet, cela vous amène à la chaîne de makefile utilisée pour le système de construction Android qui est totalement différente du système de construction Linux. Dans ces makefile, il y a beaucoup de commentaires décrivant ce que fait quoi. J'ai trouvé que ce que je veux faire n'est pas fait par NDK mais ferait partie d'Android lui-même. –

Répondre

1

Près d'un an plus tard, mais voici un makefile qui compilera une application simple native:

NDK_USR_PATH := $(NDK_USR) 

C_FILES := $(wildcard *.c) $(wildcard *.cpp) 
O_FILES := $(patsubst %.cpp,%.o,$(C_FILES)) 
O_FILES := $(patsubst %.c,%.o,$(C_FILES)) 

out: $(O_FILES) 
     @arm-eabi-gcc -o [email protected] $< -Bdynamic -Wl,--gc-section -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,--dynamic-linker=/system/bin/linker -Wl,-rpath-link=$(NDK_USR_PATH)/lib -nostdlib $(NDK_USR_PATH)/lib/crtend_android.o $(NDK_USR_PATH)/lib/crtbegin_dynamic.o -L$(NDK_USR_PATH)/lib -lc 

%.o: %.c 
     @arm-eabi-gcc -o [email protected] $< -c -I$(NDK_USR_PATH)/include -fno-short-enums 

clean: 
     @rm -f *.o 
     @rm -f out 

Il compile tous les fichiers .c dans le même répertoire dans une application appelée « out ». Il faut que la variable d'environnement NDK_USR pointe vers le répertoire ndk "ndk/android-ndk-r7/platformes/android-14/arch-arm/usr /".

Ceci devrait relier dynamiquement à la libc bionique, et devrait permettre le développement du pilote android.

Faites attention lorsque vous copiez et collez le fichier Make ci-dessus. Make est très spécifique sur les caractères de tabulation.

+0

Merci Andres. Je vais utiliser cette astuce pour compiler C pour Android. Dans le cas de mon modem cellulaire, mon vrai problème était que la couche d'interface de bas niveau (RIL) et la couche supérieure du système d'exploitation sont différentes dans Android et Linux. Donc, Porting était bien pire que de recompiler le code. –

Questions connexes