8
votes

Comment créer une bibliothèque native C ++ sur Android?

Je dois écrire une bibliothèque de liaison dynamique en C ++ utilisée par Java sur Android. Comme je l'obtiens, cela devrait être la bibliothèque .so, mais je ne sais pas comment faire ça. J'ai essayé Cygwin, mais il se bloque:

$ GCC 1.CPP

/USR/LIB/GCC/I686-PC-CYGWIN/4.3.4 /../../../..../ I686-PC-CYGWIN / BIN / LD: impossible de trouver -Luser32 Collect2: LD Retourné 1 statut de sortie xxx

Peut-on peut-il m'aider avec ça?

PS Je ne suis pas bon à * Nix, donc ça devrait être Mieux fait sous Windows

UPD: J'ai installé à la fois Android NDK et Cygwin et les a ajoutés à la variable d'environnement de chemin

: Merci d'avoir aidé. Le problème était avec Cygwin lui-même. La réinstallation et NDK résolva le problème.


0 commentaires

3 Réponses :


0
votes

Regardez les échantillons qui viennent avec le NDK. Vous devez utiliser des liaisons JNI pour lui permettre de communiquer avec Java. Sous ces liaisons, vous pouvez faire ce que vous voulez, mais tout ce qui doit être accessible depuis Java doit passer par les liaisons JNI. Tout ce qui n'a pas besoin d'être accessible peut être écrit comme vous le feriez normalement.

Et oui c'est parfaitement faisable sous Windows.


0 commentaires

1
votes

Vous aurez probablement besoin de NDK Android pour compiler et relier des bibliothèques natales sur Android. Cygwin et Windows doivent fonctionner (Cygwin fournit les outils requis * Nix).

Pour moi, il semble que vous ayez compilé la source C ++ pour un environnement hivernel, qui est totalement différent des téléphones Android. Donc, si vous chargez cette bibliothèque sur le téléphone, cela s'écrasera certainement / ne fonctionnera pas du tout.

Voici un Article qui pourrait aider . Il couvre la partie Android-NDK / Cygwin et devrait fournir des pointeurs à plus d'informations.

Modifier

soupir - une partie de la main du message d'erreur à Google et a été surprise qu'il n'y ait aucun résultat avec l'User32 Lib ... puis j'ai réalisé que la pièce -Luser32 supprimé efficacement tous les user32 liens associés à partir de la liste de résultats;)

Ceci est la liaison la plus prometteuse: http: // www. cygwin.com/ml/cygwin/2003-01/msg00292.html

Ecrivez la configuration Cygwin basiscalais et ajoutez le package contenant l'utilisateur32 Lib. Ensuite, cela devrait fonctionner.


1 commentaires

Eh bien, j'ai utilisé JNI avec C ++ .DLL-S dans Windows avant, mais j'ai des problèmes de faire de même avec un appareil basé sur Android. Le code ici est fourni uniquement pour la clarté, je sais comment écrire des bibliothèques JNI :) Il semble que mon environnement Cygwin ne soit pas configuré correctement conformément à ce message



2
votes

Pour votre exemple, utilisez g ++ au lieu de GCC, son programme C ++.

Regardez l'échantillon Hello-Jni dans le NDK. Vous devez construire votre bibliothèque partagée à l'aide du NDK et l'importer dans un projet Android Java. Dans le code Java, vous devez déclarer les fonctions natives avec «natif» et ajouter la bibliothèque à l'aide de STATIC; Voir le feuillet ci-dessous. P>

public native String  stringFromJNI();

static {
    System.loadLibrary("hello-jni");
}


0 commentaires