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.

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 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.
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

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);
	}
}
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
 
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)
Est-ce que c'est une erreur sur les type que j'utilise pour les pointeurs?

Merci pour vos idées.