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?
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.