Bonjour à tous,
Je rencontre actuellement des difficultés pour appeler des fonctions d'une dll C# à partir de Java en utilisant JNI.
J'ai tenté de suivre le tutoriel suivant :
http://www.codeproject.com/Articles/...a-Java-program
J'arrive à faire fonctionner le tutoriel qui utiliser le système Java --> C++ --> C# pour lier les 2 mondes entre eux.
Mais ma problématique est différente car moi j'ai besoin d'appeler du C# compilé dans une dll externe et non un .netmodule comme dans le tuto ci-dessus.
En gros j'ai pensé encapsuler ma dll externe C# dans un autre projet C# qui lui serait compilé en .netmodule et appelé par le Java via du C# managé.
Le schéma serait : Java --> C++ --> C# .netmodule --> C# dll externe.
J'ai donc crée le code source pour tout cela :
Code java (CallISyncJava.java) :
Code Java JNI .h auto généré dans un dossier "Java" (CallISyncJava.h) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public class CallISyncJava { static { System.load("C:\\Users\\Administrateur\\Documents\\JNI\\POC\\CallISyncCpp.dll"); } public native void DisplayText(); public static void main (String[] args) { CallISyncJava ISyncInstance = new CallISyncJava(); ISyncInstance.DisplayText(); } }
Code C++ (CallISyncCpp.cpp) :
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 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class CallISyncJava */ #ifndef _Included_CallISyncJava #define _Included_CallISyncJava #ifdef __cplusplus extern "C" { #endif /* * Class: CallISyncJava * Method: DisplayText * Signature: ()V */ JNIEXPORT void JNICALL Java_CallISyncJava_DisplayText (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
#include <jni.h>
#include "..\MCPP\CallISyncJava.h"
#include "..\Java\CallISyncJava.h"
JNIEXPORT void JNICALL Java_CallISyncJava_DisplayText(JNIEnv *jn, jobject jobj)
{
ISyncWrapperCpp *myISyncInstance = new ISyncWrapperCpp();
myISyncInstance->callDisplayText();
}
Code C++ .h placé dans un dossier MCPP qui appelle le C# .netmodule (CallISyncJava.h):
Code C# compilé en .netmodule (ISyncWrapper.cs) :
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 #using <mscorlib.dll> #using "..\ISyncWrapper\bin\Debug\ISyncWrapper.netmodule" using namespace System; public __gc class ISyncWrapperCpp { public: ISyncWrapper __gc *t; ISyncWrapperCpp() { t = new ISyncWrapper(); } void callDisplayText() { t->DisplayText(); } };
Le code C# ISyncWrapper.cs embarque une référence externe vers une dll ISync.dll dont je ne connais que la signature de méthode DisplayText(). Pour information cette méthode n'est qu'un exemple simple pour afficher un texte, en réalité cette dll sera plus complexe, là j'en ai crée une de test juste pour moi avec une seule méthode DisplayText() qui affiche une popup C#.
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 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; public class ISyncWrapper { ISync.ISync myISyncRef = new ISync.ISync(); /** * Default constructor. */ public ISyncWrapper() { } /* * Test displaying some text without parameters in the console. */ public void DisplayText() { this.myISyncRef.DisplayText(); } }
Donc après compilation des différents fichiers source, quand j'exécute, la JVM crashe :
Le fichier de crash généré par la JVM est en fichier attaché.
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 # # A fatal error has been detected by the Java Runtime Environment: # # Internal Error (0xe0434352), pid=1144, tid=4424 # # JRE version: 7.0_17-b02 # Java VM: Java HotSpot(TM) Client VM (23.7-b01 mixed mode, sharing windows-x86 ) # Problematic frame: # C [KERNELBASE.dll+0x812f] RaiseException+0x54 # # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # C:\Users\Administrateur\Documents\JNI\POC\hs_err_pid1144.log # # If you would like to submit a bug report, please visit: # http://bugreport.sun.com/bugreport/crash.jsp # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. #
Si quelqu'un peut m'aider à réaliser cela, peut-être que je n'utilise pas la bonne méthode et qu'il y a une façon plus simple d'appeler une dll externe à partir de Java en ne connaissant que la signature des méthodes.
Merci d'avance, n'hésitez pas à me demander des détails car là je suis totalement bloqué depuis plusieurs jours.
Contrec
Partager