Bonjour tout le monde ,
Je viens à vous pour de l’aide
Je suis entrain depuis hier d’essayer de créer une so (Shared Object) sous Linux dont le code c-c++ est équivalent à une DLL sous Windows.
Donc en gros j’ai créé un .cpp contenant 3 simples fonctions, un header et un .def sous visual 2010. Visual me crée ma DDL.
Ensuite je lis la DDL grâce à JNA sous Windows avec NetBeans.
J’arrive à lire ma DLL sans problème.
Maintenant j’essaye de créer une SO. Je me doute bien qu’il faut changer une partie du code de mes fichiers. Mais là, je suis perdu, je ne trouve rien qui m’aide sur Internet et je bloque.
Voici mes codes :
.cpp
.h
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 // myDLL.cpp : Defines the exported functions for the DLL application. // #include "myDLL.h" #include "stdafx.h" #include <windows.h> #include <stdio.h> BOOL APIENTRY myDLL(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } extern "C" void Initialize() { printf("\n Bonjour \n"); } extern "C" void Release() { // Déclaration et initialisation d'un buffer contenant la chaine à écrire char chaine[] = "Hello, world !\n"; // déclaration d'un pointeur sur fichier FILE* fichier; // ouverture du fichier en mode "append" (ajout) fichier = fopen("./sortie.txt","a"); // écriture de la phrase fwrite((void*)chaine,1,strlen(chaine),fichier); // fermeture du fichier fclose(fichier); // renvoie 0 = pas d'erreur } extern "C" int TestFunction(int _Value) { return (_Value * _Value); }
.def
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 #ifndef __API_MYDLL_H #define __API_MYDLL_H #if defined (__cplusplus) extern "C" { #endif //Main API functions declaration typedef void (__stdcall *DLL_Function_Initialize) (); typedef void (__stdcall *DLL_Function_Release) (); typedef int (__stdcall *DLL_Function_TestFunction) (int _Value); #if defined (__cplusplus) } #endif #endif __API_MYTDLL_H
Java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ; TestDLL.def : Declares the module parameters for the application LIBRARY myDLL DESCRIPTION 'Example of DLL' EXPORTS ; Explicitly exported initialization routine Initialize @1 Release @2 TestFunction @3
Donc quand je suis sous Linux avec le code c++, quand je compile en gcc/g++
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
20
21
22
23
24
25
26 package testdlljava; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; public class TestDLLJava { public interface myLib extends Library { public void Initialize(); public void Release(); public int TestFunction (int _value); } public interface myWin extends myLib{} public static void main(String[] args) { // TODO code application logic here myLib lib = (myLib) Native.loadLibrary("myDLL",Platform.isWindows() ? myWin.class : myLib.class);// System.out.print("\n Resultat :" + lib.TestFunction(5)); lib.Release(); System.out.print("\n"); } }
il me met évidement problème avec '__stdcall et aussi avec la fonction myDLL obligatoire si j'ai bien compris audessus dans le cpp pour la DLL.
Questions :
Est-ce que je fais bien d’uiliser JNA au lieu de JNI par contre ?
Est-ce que je suis dans le bon pour la DLL ?
Est-ce que c’est bien de créer la DLL par Visual ?
Qu’est-ce qu'il faudrait faire pour que je puisse créer le so avec les mêmes fonctions ?
Enfin je suis preneur de toutes suggestions et je vous remercie déjà d'avance pour le temps que vous consacrez.
J’espère que je me suis bien exprimé et que je suis dans la bonne partie du forum pour poster.
Cordialement,
BASTIN J.
Partager