Avatar billede superanden Nybegynder
05. november 2009 - 09:31 Der 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?

På forhånd mange tak!
Avatar billede arne_v Ekspert
05. november 2009 - 15:19 #1
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.
Avatar billede superanden Nybegynder
05. november 2009 - 17:52 #2
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?
Avatar billede arne_v Ekspert
05. november 2009 - 18:39 #3
Ikke spor kompliceret.

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.
Avatar billede arne_v Ekspert
04. december 2009 - 20:46 #4
OK ?
Avatar billede superanden Nybegynder
11. januar 2010 - 12:03 #5
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester