Bonjour à tous,
Je dois faire appel à une fonction présente dans une dll C++. J'ai suivi le tuto de adiGuba ici
Voici la signature le de fonction à utiliser dans la dll.
Les paramètres type,intdata1/2/3 et strdata1/2 sont des entrées. D'après ce que j'ai compris on les passe par valeur simplement et JNA s'occupe des conversions nécessaires.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 __declspec( dllexport ) char* create_symbol(char* type, int intdata1, int intdata2, int intdata3, char* strdata1, char* strdata2, int& nb_port_left, int& nb_port_right, char**& port_names, char*& symbol_banner)
Les paramètres nb_port_left, nb_port_right, port_names, symbol_banner sont passés par adresse. ce sont les valeurs de retours.
J'ai créé l'interface DllImport qui doit hériter de jna.Library comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 package jnatest; import com.sun.jna.Library; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.PointerByReference; public interface DllImport extends Library { String create_symbol(String _type, int _intdata1, int _intdata2, int _intdata3, String _strdata1, String _strdata2, IntByReference _nbPortLeft, IntByReference _nbPortRight, PointerByReference _portNames, String[] _symbolBanner); }
Et ensuite le main
Et j'ai l'erreur suivante :
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 package jnatest; import com.sun.jna.Native; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.PointerByReference; public class DllImportMain { static { System.loadLibrary("mydll"); } public static void main(final String[] args) { final String libName = "mydll"; final DllImport scerneImport = (DllImport)Native.loadLibrary(libName, DllImport.class); final IntByReference _nbPortLeft = new IntByReference(); final IntByReference _nbPortRight = new IntByReference(); final PointerByReference _portNames = new PointerByReference(); final String[] _symbolBanner = new String[1]; scerneImport.create_symbol("eres", 1, 0, -1, "", "", _nbPortLeft, _nbPortRight, _portNames, _symbolBanner); } }
Est-ce que c'est une erreur sur les type que j'utilise pour les pointeurs?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Exception in thread "main" java.lang.Error: Invalid memory access at com.sun.jna.Native.invokePointer(Native Method) at com.sun.jna.Function.invokePointer(Function.java:470) at com.sun.jna.Function.invokeString(Function.java:651) at com.sun.jna.Function.invoke(Function.java:395) at com.sun.jna.Function.invoke(Function.java:315) at com.sun.jna.Library$Handler.invoke(Library.java:212) at com.sun.proxy.$Proxy0.create_symbol(Unknown Source) at jnatest.ScerneImportMain.main(ScerneImportMain.java:32)
Merci pour vos idées.
Partager