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
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
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); }
je n'affiche pas les fichier de la classe measur car cette classe fonctionne correctement, enfin je suppose
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; }
voici maintenant les fichier coter java avec dans un premier temps l'interface de déclaration de la lib et des fonctions
la classe wginput
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); }
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 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 } }
et donc en sortie le terminal devrait m'afficher
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); } }
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 mean 7.5 sd4
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
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
Partager