Toon posts:

[JNI] teruggave van variabelen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,
Kunnen jullie dit verklaren? Ik stel mijn variabelen op in mijn c applicatie.
Met een void method in mijn C applicatie laat ik deze zien door een printf statement. Dan verandert teneerste mijn button_selected variabele al van 1 naar 522852.

Vervolgens roep ik een method aan vanuit mijn C applicatie uit mijn Java applicatie, deze call neemt variabelen mee. En daarna roept mijn Java applicatie een Messegebox op die deze variabelen gebruikt.

Hieronder staat per stap wat hij met de variabele doet en dus weergeeft. Zoals je ziet dus steeds weer wat anders. Behalve mijn message_id. Het zijn allemaal integers. Weet iemand waarom de variabelen veranderen? En waarom de ene wel goed blijft en de andere niet?

Uitkomst printf en System.out.println

C message_id = 1
C button1 = 100
C button2 = 0
C button3 = 0
C button4 = 0
C button_selected = 522852

JAVA message_id = 1
JAVA button1 = 9383512
JAVA button2 = 145278384
JAVA button3 = 522856
JAVA button4 = 268439704
JAVA button_selected = 1

In frame message_id = 1
In frame button1 = 9383512
In frame button2 = 145278384
In frame button3 = 522856
In frame button4 = 268439704
In frame button_selected = 1

Verwijderd

En je denkt dat we hier helderziend zijn? Alleen D2k, die heeft een glazen bol.. maar die moet dit maar net lezen. Voor de rest van ons zul je toch echt wat code moeten posten...

Verwijderd

Topicstarter
OK,

Hieronder heb ik de weg weergegeven van mijn variabele button1. Ik heb alle dingen die niet van toepassing zijn weggelaten. Dus de code is nu een beetje vaag. Maar anders wordt alles te lang. De volgorde van mijn app klopt op deze manier.

Eerst wordt de variable genaamd BUTTON_OK gezien als "100" door de volgende code.

C:
1
2
3
//mnumber.h define BUTTON_OK naar 100

#define BUTTON_OK  100


Daarna maak ik in mijn main c applicatie de button1 variabele aan en geef hem de waarde BUTTON_OK <-- dus "100". Middels de void MessageBox roept mijn app de Java method aan MBox. En geeft dus de variable button1 mee. Bij deze transactie van de variabele verandert hij dus,

C:
1
2
3
4
5
6
7
8
9
10
11
12
//deze c applicatie includes mnumber.h 
//roept void MessageBox op

void MessageBox (int button1);

JNIEXPORT jint JNICALL Java_Pcimain_PciStart (JNIEnv *env, jobject obj, jint button1){}

void DemoMessageBox (void) {

MessageBox (BUTTON_OK);

}


C:
1
2
3
4
5
6
7
//the MessageBox void

void MessageBox (int button1)


//In mijn callback functie roept mijn void de Java method Mbox aan met de parameter button1 met de waarde 100
mid = (*jenv)->GetMethodID(jenv, cls, "Mbox","(I)V");


Java:
1
2
3
4
//Java main class
public native int Start(int button1);
private void Mbox(int button1)
MBoxFrame frame = new MBoxFrame(button1);


Java:
1
2
//MBoxFrame
public MBoxFrame(int button1){}

Verwijderd

Ik neem toch aan dat die button1 een jint moet zijn voordat je um kunt gebruiken in je callback. Ik zie trouwens dat je hetzelfde probleem al eens had met long/jlong.

Hoe je een jint een waarde geeft in c weet ik niet.. zal wel een functie voor zijn om een int om te zetten naar een jint.

[edit]

Oh ik zie dat het proxy klassen zijn met overloaded operators. Zoiets moet dus wel werken:

C:
1
2
3
4
5
6
7
8
void MessageBox (int button1)
{
    jint jbutton1 = button1;
    ..
    mid = (*jenv)->GetMethodID(jenv, cls, "Mbox","(I)V");
    ..
    // en dan die jbutton1 gebruik in je call back ipv button1
}


offtopic:
grappig spul wel, weet iemand toevallig een commandline c compiler voor windows zonder dat ik visual studio o.i.d. moet installeren? Ik zie in tutorials dat ze met cl.exe werken..

[ Voor 54% gewijzigd door Verwijderd op 26-11-2003 12:18 ]


Verwijderd

Topicstarter
Dat snap ik niet helemaal?
Wat moet ik nou met die jbutton1 doen?

Die variabele in mijn java gebruiken?

Verwijderd

Verwijderd schreef op 26 november 2003 @ 13:41:
Dat snap ik niet helemaal?
Wat moet ik nou met die jbutton1 doen?

Die variabele in mijn java gebruiken?
meegeven aan void MBox(int) ipv die button1

Verwijderd

Topicstarter
Ok tnx!! Het werkt nu wel ja. Bedankt. Waarom werkt het nu wel dan?

Verwijderd

Verwijderd schreef op 26 november 2003 @ 13:48:
Ok tnx!! Het werkt nu wel ja. Bedankt. Waarom werkt het nu wel dan?
Een int in je c code en een int in je java code zijn verschillende dingen. Daar hebben ze nou precies al die j<type> dingen voor bedacht. Als je het echt wilt weten moet je maar een JNI tutorial lezen. Deze stof is eigenlijk de meest basic info die in al die tutorials staat. (Daar vond ik het, heb zelf nog nooit met JNI gewerkt) Bovendien heeft Glimi je dat ook al een keer uitgelegd (maar dan met long ipv int).

[ Voor 12% gewijzigd door Verwijderd op 26-11-2003 13:56 ]


Verwijderd

offtopic:
fladder - "grappig spul wel, weet iemand toevallig een commandline c compiler voor windows zonder dat ik visual studio o.i.d. moet installeren? Ik zie in tutorials dat ze met cl.exe werken."

je zou eens kunnen kijken naar MinGW:
"A collection of freely available and freely distributable Windows specific header files and import libraries combined with GNU toolsets that allow one to produce native Windows programs that do not rely on any 3rd-party DLLs."
Pagina: 1