Toon posts:

[Java] Win32 API direct aanspreken *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,
Ik ben nu bezig om een java applicatie te maken die methods uit een
library moet halen gemaakt middels c.

Ik heb een oudere versie van dit programma. Hier bevat een c (test.c) programma zelf de functies, en gebruikt een lib (testlib.dll) om de uitkomsten te laten zien.

Mijn uitdaging is nu om vanuit een java applicatie deze c functies op te roepen.
Alle functies die (tect.c) gebruikte moeten dus in deze library komen. Middels JNI wil ik deze functies dan kunnen aanroepen. Simpele printf functies kan ik wel oproepen, maar weet niet precies hoe ik nou met de rest moet beginnen.

Functies als GetProcAddress.

Heeft iemand een tip voor me? De link van sun
http://java.sun.com/docs/books/tutorial/native1.1/
heeft me aardig geholpen, maar loop dus vast als ik verder wil.

Iemand handige voorbeeld linkjes ofzo? Over native methods?

Alvast bedankt.

Gr

  • Martkrui
  • Registratie: Februari 2002
  • Laatst online: 25-05 21:57
[edit: verhaal wat verduidelijken]
Om vanuit java een C dll aan te roepen moet je een 2 traps raket maken

Stap 1 : met jni een eigen geschreven C functie aanroepen mbv JNI
Stap 2 : de eigen C functie roept de DLL functie aan. (soort doorgeefluik)

Ikzelf heb dit eens gedaan om de lpt aan te sturen vanuit java.

Let er wel op dat de functie namen in het C programma afhankelijk zijn van de package naam van het aanroepende java deel. Dit heeft mij eens een dag schelden gekost

[ Voor 42% gewijzigd door Martkrui op 29-10-2003 12:08 ]

I haven't lost my mind! It's backed up on tape somewhere!


Verwijderd

Topicstarter
Ok,

Heb ik dan straks 3 bestanden?

Java - C - dll

Of heb ik het verkeerd begrepen en moet ik iets samenvoegen?

  • Martkrui
  • Registratie: Februari 2002
  • Laatst online: 25-05 21:57
Yeb, dat krijg je als je een DLL wilt aanroepen die je niet zelf kan (of wilt) wijzigen.

Als je de code wel hebt, kan je ook alles in het stuk C zetten, scheelt weer werk.

I haven't lost my mind! It's backed up on tape somewhere!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Bedoel je dat je eigenlijk elke willekeurige functie in elke willekeurige dll wilt aanroepen?

Dan moet je idd eerst GetProcAddress () mappen, en die retourneert een functiepointer. Echter, die functiepointer kun je niet vanuit java gebruiken, en daar zul je dus ook een call functie voor moeten maken.

Denk eraan dat deze call functie niet weet hoe de parameters van de aan te roepen functie in elkaar zitten, en dus zul je vanuit java een beschrijving mee moeten geven. En dan zit je met het volgende probleem: de call functie weet dan wel wat ie door moet geven, maar omdat het geheel dynamisch is kan het niet gewoon met C code. En daar komt dan een stukje assembler code bij kijken waarmee je de parameters met de hand op de stack pushed. Lees eerst wel even wat informatie over cdecl en stdcall calling conventies, dan snap je ook hoe het ongeveer in z'n werk gaat

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
De code heb ik wel, van de oude situatie:

Een c programma communiceert met een dll

Nu wil ik dit dus in java doen.
Ik loop helemaal vast bij het oproepen van enkele methods.
Als ik dit weet kan ik weer verder ;). Is misschien iets simpels maar ik
kom er niet uit:

Men maakt dus gebruik in de oude situatie van een

int main (int argc, char *argv[])

In de c source.
Daaronder staan verschillende functies, die ik in de library moet configureren met JNI. Kan ik deze methoden dan gewoon in de library zetten en oproepen met behulp van JNI vanuit mijn java app. Of moet ik ook deze source waarmee ik dus die library maak totaal veranderen. (Die ik dus al wel heb van mijn oude situatie).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Oh ok, je wilt dus niet elke mogelijke functie aanroepen mbv GetProcAddress ()

Ja, dan is het gewoon een kwestie van het 1:1 mappen van die functies met JNI, dus voor elke functie die je aan wilt roepen moet je een JNI equivalent maken wat gewoon als wrapper dient. Ik zie het probleem dan eigenlijk niet helemaal?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1