Toon posts:

[JNI] Callback method werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit nu weer met een volgend probleem waar ik echt niet uit kom.
Wanneer ik een JAVA method wil oproepen vanuit mijn C library met de
callback functie van JNI krijg ik foutmeldingen als deze:

type 'JNIEnv_' does not have an overloaded member 'operator ->'


Deze foutmelding hoort bij deze regel:

jclass cls = (*env)->GetObjectClass(env, obj);


Ik heb vervolgens gezocht waar aan dit zou liggen, ik kwam bij de oplossing om deze regel te veranderen in:

jclass cls = env->GetObjectClass(obj);


Waardoor dus deze foutmelding verdwijnt. Echter wil ik deze code in een
void methode stoppen. Dus dat deze void functie de call functie regelt zeg maar in mijn library:

void LocalMessageBox (long message_id, char *info, long button1, long button2, long button3, long button4, long *button_selected){

//Callback functie

}

Maar dan krijg ik weer foutmeldingen als:

'env' : undeclared identifier


??? Ik heb echt geen idee waardoor dit komt. Iemand suggesties?

P.s Hoe krijg ik source code in zo'n wit tabelletje waardoor de topic overzichterlijker wordt?

Gr Azi

Verwijderd

Topicstarter
Bedankt maar ik heb het al gevonden.

Teneerste is er een verschil als je je lib maakt met een file extensie .cpp en .c
Ten tweede had ik de volgorde van een declaraties niet goed staan.

Gr Azi

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Verwijderd schreef op 05 november 2003 @ 13:49:
Ik zit nu weer met een volgend probleem waar ik echt niet uit kom.
Wanneer ik een JAVA method wil oproepen vanuit mijn C library met de
callback functie van JNI krijg ik foutmeldingen als deze:
code:
1
type 'JNIEnv_' does not have an overloaded member 'operator ->'

Deze foutmelding hoort bij deze regel:
C++:
1
jclass cls = (*env)->GetObjectClass(env, obj);

Ik heb vervolgens gezocht waar aan dit zou liggen, ik kwam bij de oplossing om deze regel te veranderen in:
C++:
1
jclass cls = env->GetObjectClass(obj);
Dit staat in de JNI documentatie: http://java.sun.com/j2se/...ni/spec/design.html#wp186

Je compileert blijkbaar als C++, waardoor je dus de 2e manier moet gebruiken.
C++:
1
2
3
4
5
void LocalMessageBox (long message_id, char *info, long button1, long button2, long button3, long button4, long *button_selected){

//Callback functie

}

Maar dan krijg ik weer foutmeldingen als:
code:
1
'env' : undeclared identifier

??? Ik heb echt geen idee waardoor dit komt. Iemand suggesties?
Lees die foutmelding: env is niet gedeclareerd. Hij staat niet in de parameterlijst van de functiedeclaratie terwijl alle functies die vanuit Java moeten kunnen worden aangeroepen als eerste parameter die env moeten hebben (JNIEnv *env), zie de JNI specs.

Ook klopt de naam van de functie (LocalMessageBox) niet en moet het een JNIEXPORT void JNICALL functie zijn (de declaratie maak je met de "javah" tool aan de hand van de Java classfile). Alleen native functies die aan de JNI specs voldoen kan je vanuit Java aanroepen, dus niet zomaar een willekeurige functie.

Misschien is het een goed idee om de JNI tutorial door te nemen: http://java.sun.com/docs/books/tutorial/native1.1/index.htm
P.s Hoe krijg ik source code in zo'n wit tabelletje waardoor de topic overzichterlijker wordt?
met [ code=c++] voor de code en [/code] erna bijvoorbeeld, zonder de spatie na [

[ Voor 10% gewijzigd door matthijsln op 05-11-2003 16:32 ]