05. november 2009 - 09:31Der er
4 kommentarer og 1 løsning
JNI: Sæt variabel i C program fra Java?
Halløj der ude.
Jeg har lavet et C program (som kører real-tid i et UNIX RTAI miljø) som jeg ville prøve at lave en GUI til. Dog falder mine GUI kundskaber dog kun indenfor java swing/awt kategorien så jeg har derfor lavet en gui i java.
I denne GUI kan jeg så starte mit program med runtime.exec("mitprogram"), det virker perfekt.
C programmet kører en løkke while(stop == 0){ //Gennemløb kode og her sættes stop ikke! }
Er det muligt at jeg i mit java program kan sætte denne stop variabel (det er en global C variabel) ved f.eks. klik på en knap i min GUI?
Det er meget vanskeligt at saette en variabel i en anden process (det kraever brug af global/shared memory).
Men hvis du erstatter Runtime exec med brug af JNI bliver det nemmere.
Du laver en lille Java native klasse med to metoder: - run - setStopFlag genererer .H fil og implementerer den to metode - run er jo bare indholdet af din nuvaerende main.
Hmm nu har jeg rigtig mange funktioner i min C kode spredt ud over rigtig mange filer så hvis jeg skal lave det hele ind i en run klasse i java bliver det nok lidt kompliceret.
Hvor kompliceret ville det være at lave shared memory mellem RTAI C programmet og Java applikationen, kan du evt. give nogle fif.?
Jeg tænkte på om det kunne være en ok løsning når nu det kun drejer sig om 1 stop flag at lave en læsning/skrivning fra fil mellem programmerne? Således at mit C program efter hver løkke læser i en txt fil om der står 0 eller 1. og så skriver jeg til filen fra javaprogrammet? Jeg vil kun skulle skrive et stop flag til den højest en gang i minuttet. Læsningen vil ske 1 gang hvert 29ms. Jeg tænker på om jeg kan få komplikationer hvis de begge prøver at få fat i filen samtidigt?
Du: - laver en Java native klasse med 2 metoder - du genererer stub fra den - du renamer main til jni_main - i den ene metode (run) kalder du jni_main - i den anden metode goer det det du nu vil
Det er et eller andet sted mellem 1% og 5% af de rettelser du skal lave for at saette et flag i global/shared memory.
Tak for hjælpen. Jeg fik det til at virke. Det var dog mere kompliceret end jeg havde håbet. I den endelige løsning lavede jeg en socket forbindelse mellem de 2 programmer på den samme pc i stedet.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.