Acceder a une dll deja presente

[Résolu]
Signaler
Messages postés
47
Date d'inscription
mardi 4 juillet 2006
Statut
Membre
Dernière intervention
5 septembre 2006
-
Messages postés
47
Date d'inscription
mardi 4 juillet 2006
Statut
Membre
Dernière intervention
5 septembre 2006
-
salut


j'avais posté un message sur les dll et on m'a repondu gracieusement


je suis arrivé à comprendre il s'agit de quoi exactement surtout que j'ai repris le script que m'a fournis twinuts avec tous ses etapes


mon probleme la est comment acceder a une dll déja existante ca je n'ai pas su le faire


besoin de votre aide

7 réponses

Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Bon je pars du principe que tu as compris comment fonctionne le JNI donc je ne reviendrai pas dessus :D


-----------------------------------------------------------------

voici le code java


public class Test {


    static{

        System.loadLibrary("JWin");//librairie contenant le wrapper JNI

    }


    public static native String getEnvironementvariable(String name);

   

    public static void main(String [] args){

        System.out.println(getEnvironementvariable("path"));

    }

}


-----------------------------------------------------------------

fichier header


/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class Test */


#ifndef _Included_Test

#define _Included_Test

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     Test

 * Method:    getEnvironementvariable

 * Signature: (Ljava/lang/String;)Ljava/lang/String;

 */

JNIEXPORT jstring JNICALL Java_Test_getEnvironementvariable

  (JNIEnv *, jclass, jstring);


#ifdef __cplusplus

}

#endif

#endif


-----------------------------------------------------------------


fichier cpp


#include "Test.h"

#include <string>


using namespace std;//pour eviter de devoir taper std::string


//je code sous linux donc ca evite les erreurs inutile

#ifdef WIN32

    #include <windows.h>


    bool WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){

        return TRUE;

    }

#endif


#define BUFF_SIZE 500 //je prevois peut etre large mais bon


JNIEXPORT jstring JNICALL Java_Test_getEnvironementvariable(JNIEnv *env, jclass jcls, jstring jname){

    #ifndef WIN32

       return NULL;

    #endif

    string c_string;//pour recevoir la chaine java

    jboolean isCopy;//pour tester si la copie de la chaine java vers C s'est bioen passée

    char *buff = new char[BUFF_SIZE]; //chaine C qui va contenir le resultat de GetEnv

    buff[0] = 0;//on initialise la chaine a zero

    //on passe le string java en string C

    c_string = env->GetStringUTFChars(jname, &isCopy);


    if(env->ExceptionOccurred()){//test si on a pas declanche une exception

        env->ExceptionDescribe();//si oui on l'affiche

        env->ExceptionClear();//on release la stack d'exception

        return NULL;//pas la peine de continuer

    }


    //recuperation des variables associees a celle passe en parametre

    GetEnvironmentVariable(c_string.c_str() , buff , BUFF_SIZE);


    if(isCopy == JNI_TRUE)//si la copie s'est bien passée alors on relache la chaine

      env->ReleaseStringUTFChars(jname, c_string.c_str());

   

    jstring jret = env->NewStringUTF(buff);

    if(env->ExceptionOccurred()){//test si on a pas declanche une exception


        env->ExceptionDescribe();//si oui on l'affiche


        env->ExceptionClear();//on release la stack d'exception


        return NULL;//pas la peine de continuer


    }


    //on release le tab en C

    delete [] buff;

   

    //on retourn la chaine java contenant le result de la recherche

    return jret;

}


voila tu creer un DLL qui porte le nom JWin (sinon pense à modifier le
nom dans le code java), tu la met a coté de ton .class et tu run le le
code java(j'ai testé ça fonctionne).


voilou voilou

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,


tu ne peux y acceder sans passer par un wrapper JNI et si elle sont
present et que tu n'en est pas l'autreur il faut qu'appartir de ta lib
jni tu l'as load (en C/C++) si tu en es l'auteur tu peux encapsuler ton
wrapper dedans.


Pour loader une fonction d'une dll sous windows c'est assez simple tu dois connaitre 2 choses

1 son nom

2 la signature de la fonction

exemple dans le code que j'ai posté je désir utiliser la fonction JAWT_GetAWT de la dll jawt.dll

cette fonction à la signature suivante

jboolean -> ce quelle retourne

JAWT_GetAWT -> son nom

JNIEnv* env -> son premier argument

 JAWT* awt -> son deauxieme argument


pour la loader je procède ainsi


//definition d'un type correspondant à la signature de la fonction

typedef jboolean  (JNICALL* lpfnJawtGetAwt)(JNIEnv* env, JAWT* awt);


//creation d'un HMODULE en gros c'est pour y stoquer son instance

HMODULE hjawt = NULL;

//creation d'une variable de type lpfnJawtGetAwt

lpfnJawtGetAwt mJAWT_GetAWT = NULL;


if(hjawt == NULL){

    //chargement de la lib jawt afin de recuperer une reference valide

    //sur la fonction JAW_GetAWT

    hjawt = GetModuleHandle("JAWT.DLL");

    if (hjawt == NULL){//petit test

        cerr << "JAWT.DLL not found" << endl;

        return;

    }

    //récupération de la fonction le '_' en début et le '@8' a la fin c'est que le code est en CPP

    mJAWT_GetAWT = (lpfnJawtGetAwt)GetProcAddress(hjawt,"_JAWT_GetAWT@8");

    if (mJAWT_GetAWT == NULL) {

        cerr << "JAWT_GetAWT function not found" << endl;

        return;

    }


et pour l'utilisation c'est assez simple

JNIEnv *env;

JAWT awt;

...

jboolean result = mJAWT_GetAWT(env, &awt);


/!\ N'oublie pas de relacher la dll qd tu n'en as plus besoin

FreeLibrary(hjawt);

hjawt = NULL;

mJAWT_GetAWT = NULL;


voilou si tu as des dificulté de comprehension je t'encourage vivement
d'aller sur cppfrance pour poser ta question sachant que ton problème
sort du context java

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
47
Date d'inscription
mardi 4 juillet 2006
Statut
Membre
Dernière intervention
5 septembre 2006

salut
si c'est le cas c'est quoi ce que je vient comme programme
public class GetEnv
{
    static public void main(String[] arg)
    {
        System.out.println("PATH = " + getEnv("path"));
        System.out.println("CLASSPATH = " + getEnv("classpath"));
    }


    static String getEnv(String name)
    {
        StringBuffer value = new StringBuffer(128);


        int chars = GetEnvironmentVariable(name, value, value.capacity());


        if (chars == 0)
        {
            return null;
        }


        if (chars >= value.capacity())
        {
            value.ensureCapacity(chars);
            GetEnvironmentVariable(name, value, value.capacity());
        }
        return value.toString();
    }


    /** @dll.import("KERNEL32",auto) */
    static native int GetEnvironmentVariable(String name, StringBuffer buf, int size);
}

je suis totalement confuse là
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,


que veux tu faire exactement donne moi les info j'essayerai de t'aider au mieux

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
47
Date d'inscription
mardi 4 juillet 2006
Statut
Membre
Dernière intervention
5 septembre 2006

je veux au juste acceder à une dll windows avec java voila


merci twinuts de votre aide vous etes un membre genial
Messages postés
47
Date d'inscription
mardi 4 juillet 2006
Statut
Membre
Dernière intervention
5 septembre 2006

salut
donc ca m'interesse de voir fonctionner les exemples que je vous est presente
Messages postés
47
Date d'inscription
mardi 4 juillet 2006
Statut
Membre
Dernière intervention
5 septembre 2006

merci twinuts je vais essayer