IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Equivalent d'une fonction *.dll


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Equivalent d'une fonction *.dll
    Bonjour à toutes et à tous,

    Dans une application que j'avais développée en Pascal objet (via Delphi puis Lazarus), j'utilisais une ou plusieurs "dll" que j'attachais à mon application pour réaliser des fonctions qui n'existaient pas dans l'application de base.

    L'application et la "dll" étaient compilées indépendamment l'une de autre. La liaison ne se faisait qu'à l'exécution.

    Lors de l'exécution, si la "dll" n'était pas présente, un message m'en alertait sans pour autant que l'application plante.

    Existe-t-il un "concept" ou une "méthode" ou, je ne sais pas comment l'appeler, qui ferait la même chose.

    Cordialement.

    Pierre.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Tu peux faire des librairie partagée via le ndk. Tu te retrouve avec des .so (equivalent du .dll de windows) créer en c ou c++ que tu peux charger dynamiquement dans ton application.
    Par contre c'est un tout autre pan de la programmation android qui est loin d'être facile à appréhender.

    Tu peux faire également la même chose directement en java avec des fichier dex. Tu as un exemple basique ici : https://stackoverflow.com/a/6860579/393984
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par grunk Voir le message
    Tu peux faire des librairie partagée via le ndk. Tu te retrouve avec des .so (equivalent du .dll de windows) créer en c ou c++ que tu peux charger dynamiquement dans ton application.
    Par contre c'est un tout autre pan de la programmation android qui est loin d'être facile à appréhender.

    Tu peux faire également la même chose directement en java avec des fichier dex. Tu as un exemple basique ici : https://stackoverflow.com/a/6860579/393984
    Cette deuxième partie me semble plus à ma portée bien que je n'ai pas trop compris comment il transformait sa classe en fichier .dex.

    A approfondir.

    Cordialement.

    Pierre.

  4. #4
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    J'essaie de mettre en œuvre l'exemple que tu m'as donné. J'ai crée un classe "ClasseEXt" comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class ClasseExt extends Activity {
     
        public ClasseExt() {
            Log.d(ClasseExt.class.getName(), "ClasseExt: constructor called.");
        }
     
        public int ajout(int a, int b) {
            return a + b;
        }
     
        public int soustrait(int a, int b) {
            return a - b;
        }
     
        public void rienfaire() {
            int a = 1 + 1;
        }
     
    }
    Je l'ai compilée, j'ai renommé le fichier apk en "fct-ext.jar" que j'ai placé dans la mémoire public de mon smartphone.

    Maintenant j'ai une application utilisatrice où j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    		try {
    			final String libPath = Environment.getExternalStorageDirectory() + "/fct-ext.jar";
    			final File tmpDir = getDir("dex", 0);
     
    			final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
    			final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("com.example.fctext.ClasseExt");
     
    			final Object myInstance  = classToLoad.newInstance();
    			final Method rienFaire = classToLoad.getMethod("rienfaire");
     
    			rienFaire.invoke(myInstance);
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    Je lance dette application et elle se déroule jusqu'à la fin sans problème.

    Maintenant, plutôt que de ne "rienfaire", j'essaie avec une méthode "ajout" qui accepte des paramètres en entrée et qui me retourne un résultat. J'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    		try {
    			final String libPath = Environment.getExternalStorageDirectory() + "/fct-ext.jar";
    			final File tmpDir = getDir("dex", 0);
     
    			final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
    			final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("com.example.fctext.ClasseExt");
     
    			final Object myInstance  = classToLoad.newInstance();
    			final Method ajouter = classToLoad.getMethod("ajout");
     
    			ajouter.invoke(myInstance);
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    Comme je m'en doutais, ça a créé un exception à la ligne 9. J'imagine qu'il faut que j'introduise mes paramètres et que je puisse récupérer le résultat, mais je n'ai pas réussi à trouver la syntaxe pour le faire.

    Cordialement.

    Pierre.

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    J'ai progressé, j'arrive à donner les arguments à ma méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    		try {
    			final String libPath = Environment.getExternalStorageDirectory() + "/fct-ext.jar";
    			final File tmpDir = getDir("dex", 0);
     
    			final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
    			final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("com.example.fctext.ClasseExt");
     
    			final Object myInstance  = classToLoad.newInstance();
    			final Class[] args = new Class[2];
    			args[0] = int.class;
    			args[1] = int.class;
    			final Method ajouter = classToLoad.getMethod("ajout", args);
     
    			ajouter.invoke(myInstance, 1, 1);
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    Mais j'ai toujours pas trouvé comment récupérer le résultat.

    Cordialement.

    Pierre.

  6. #6
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Bon, ben ça y est, j'ai trouvé, il fallait faire un transtypage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	int res = (int) ajouter.invoke(myInstance, 1, 1);
    Cordialement.

    Pierre.

Discussions similaires

  1. Aide pour utilisation d'une fonction DLL
    Par Hell dans le forum Langage
    Réponses: 10
    Dernier message: 22/07/2008, 10h51
  2. Equivalent d'une fonction sous 4D
    Par sscouby dans le forum 4D
    Réponses: 6
    Dernier message: 23/04/2008, 10h50
  3. [Tableaux] Equivalent d'une fonction en php
    Par Wimoux dans le forum Langage
    Réponses: 3
    Dernier message: 15/04/2008, 03h03
  4. Equivalence d'une fonction
    Par Toison dans le forum Excel
    Réponses: 2
    Dernier message: 08/04/2008, 14h38
  5. Equivalent d'une fonction en Anglais
    Par Toison dans le forum Excel
    Réponses: 5
    Dernier message: 25/01/2008, 21h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo