bonjour,
comme indiquer dans le titre il faut que j'arrive a utiliser un .so programmer par moi.
mon problème est que je n'arrive pas a récupéré les valeurs de variable simple, explication, voici mon code source du .so
le .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
class WestgardInterface {
 
private:
 
    static WestgardInterface *ms_instance;
 
protected:
 
/*CONSTRUCTOR*/
    WestgardInterface();
 
public:
    /*DESTRUCTOR*/
    ~WestgardInterface();
 
    static WestgardInterface *getInstance();
 
public:
    void WGevaluate( Measure m, double mean, double sd);
};
 
extern "C" void WGevaluate( Measure m, double mean, double sd){
    WestgardInterface* lib = WestgardInterface::getInstance();
    return lib->WGevaluate( m, mean, sd);
}
le .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
22
23
24
WestgardInterface *WestgardInterface::ms_instance = nullptr;
 
/** @details Constructor*/
WestgardInterface::WestgardInterface(){
    // TODO Auto-generated constructor stub
}
 
/** @details Destructor*/
WestgardInterface::~WestgardInterface() {
    // TODO Auto-generated destructor stub
}
 
 
WestgardInterface *WestgardInterface::getInstance(){
    if (nullptr == ms_instance)
    {
        ms_instance =  new WestgardInterface();
    }
    return ms_instance;
}
void WestgardInterface::WGevaluate(Measure m, double mean, double sd) {
    cout<<"measure"<<m.getValue()<<endl<<m.getDate();
    cout<<"mean"<<mean<<endl<<"sd"<<sd<<endl;
}
je n'affiche pas les fichier de la classe measur car cette classe fonctionne correctement, enfin je suppose
voici maintenant les fichier coter java avec dans un premier temps l'interface de déclaration de la lib et des fonctions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
public interface InterfaceLibWestgard extends Library {
 
void WGevaluateWithListOnly(WGInputs.ByValue input);
 
static InterfaceLibWestgard INSTANCE = (InterfaceLibWestgard) Native.loadLibrary("../logic/resources/calculator/libuntitled.so", InterfaceLibWestgard.class);
}
la classe wginput
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
 
public class WGInputs extends Structure {
	public Measure.ByValue m;
	public double mean;
	public double sd;
 
 
 
	public static class ByValue extends WGInputs implements Structure.ByValue {}
 
	@Override
	protected List<String> getFieldOrder() {
		return Arrays.asList(new String[] { "m" , "mean" , "sd" }); // native variables order
	}
 
}
enfin 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
public class Westgard {
    static {       
        System.setProperty("jna.library.path","../logic/resources/calculator");
    }
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		WGInputs.ByValue jnaInputs = new WGInputs.ByValue();
		Measure.ByValue m = new Measure.ByValue();
		m.valeur = 18;
		Date.ByValue d = new Date.ByValue();
		d.m_day = 10;
		d.m_month = 10;
		d.m_year = 10;
		d.m_hour = 12;
		d.m_min = 12;
		d.m_sec = 12;
		m.date = d;
		jnaInputs.m = m;
		jnaInputs.mean = 7.5;
		jnaInputs.sd = 4d;
		InterfaceLibWestgard.INSTANCE.WGevaluateWithListOnly(jnaInputs);
 
	}
 
}
et donc en sortie le terminal devrait m'afficher
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
measure18
date = 10/10/10
heure = 12:12:12
mean 7.5
sd4
or voila ce que j'obtient
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
measure18
date = 10/10/10
heure = 12:12:12
mean0
sd3.51276e+151
pour info j'ai déja tester pas mal de chose tel que le changement de type la creation d'une autre classe mais rien n'y fait impossible d'obtenir le bon résultat