[JAVA][C] Probleem met #define contstant in JNA

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
Hallo iedereen! Voor mijn dissertatie moet ik een C programma oproepen onder Java.
Hiervoor gebruik ik JNA.

Nu ben ik tegen een probleem aangelopen waar ik even geen raad mee weet, en ik hoop dat jullie me kunnen helpen.

In de header staat het volgende:

C:
1
2
3
4
5
6
7
8
9
10
11
 
#define KLT_BOOL int

#ifndef TRUE
#define TRUE  1
#define FALSE 0
#endif

#ifndef NULL
#define NULL  0
#endif


In de bijbehorende .c file staat dit:
C:
1
2
 
static const KLT_BOOL sequentialMode = FALSE;


In mijn Java code heb ik een class als Struct, alleen weet ik niet hoe ik KLT_BOOL in Java moet definieren!
Ik heb geprobeerd het als String, int en boolean te passen, maar ik heb het idee dat er meer moet gebeuren dan dat. Dus mijn vraag is: hoe definieer ik KLT_BOOL in Java?

Bij voorbaat dank :)

Groetjes RabbitHeart

Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

als een

code:
1
final boolean sequentialMode = false;


?

Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
igmar schreef op maandag 23 april 2012 @ 16:43:
als een

code:
1
final boolean sequentialMode = false;


?
Geprobeerd, jammer genoeg werkt het niet.

Het rolt er nu nog steeds uit als TRUE, omdat het niet gedefinieerd is.

Acties:
  • 0 Henk 'm!

  • IceM
  • Registratie: Juni 2003
  • Laatst online: 20-09 11:52
In C is het als int gedefinieerd, het lijkt me niet meer dan logisch om dat in java dan ook te doen?
Edit: niet gelezen dat je dat al geprobeerd had.

[ Voor 20% gewijzigd door IceM op 23-04-2012 16:57 ]

...


Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
IceM schreef op maandag 23 april 2012 @ 16:53:
In C is het als int gedefinieerd, het lijkt me niet meer dan logisch om dat in java dan ook te doen?
Edit: niet gelezen dat je dat al geprobeerd had.
Ja balen, het zou zo leuk zijn geweest als dat had gewerkt :) .

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Het is een type is gedefinieerd als int. Punt. Komt geen magie aan te pas aangezien overal war nu KT_BOOL staat door de preprocessor int wordt ingevuld.

Dat het het niet werkt ligt dan ergens anders aan. Zonder meer informatie is daar weinig over te zeggen.

Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
Ik weet bijna niets van C.

In de .c file wordt de value van KLT_BOOL "FALSE".

In de .h file wordt FALSE gedefinieerd als 0.

Ergens moet er dus een stap bij in de oplossing maar ik snap er onderhand helemaal niets meer van.

Acties:
  • 0 Henk 'm!

Verwijderd

Gewoon:
code:
1
public final int sequentialMode = 0;


Vóór C99 kende C geen echte booleans, dus werden gewoon ints gebruik met waarde 0 als false en elke andere waarde als true. Als dat niet werkt doe je waarschijnlijk ergens anders iets fout.

[ Voor 15% gewijzigd door Verwijderd op 23-04-2012 19:18 ]


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Ook de TRUE en FALSE zijn defines. Oftewel, er wordt in de code bijvoorbeeld FALSE geschreven, maar uiteindelijk komt daar gewoon 0 te staan. Lees je anders even in in C defines. Dit is echt niet zo moeilijk als je nu denkt, en ik neem aan dat je hier ook nog wat van wil leren.

Samengevat de KLT_BOOL is niets anders dan een int. Mbv de defines TRUE en FALSE wordt er de waarde 1 of 0 aan gegeven.

Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
Verwijderd schreef op maandag 23 april 2012 @ 19:18:
Gewoon:
code:
1
public final int sequentialMode = 0;


Vóór C99 kende C geen echte booleans, dus werden gewoon ints gebruik met waarde 0 als false en elke andere waarde als true. Als dat niet werkt doe je waarschijnlijk ergens anders iets fout.
Dat werkt niet :'( . Alle andere variabelen worden gewoon goed verwerkt behalve deze KLT_BOOL variabelen.

Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
Het is opgelost!! Het was gewoon een stommiteit van mijn kant. De variabelen moeten op de volgorde van klt.h en niet op die van klt.c.

Evengoed bedankt voor het meedenken.

Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
Ben ik weer met een vraag over JNA.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
unsigned char* pgmReadFile(
    char *fname,
    unsigned char *img,
    int *ncols, int *nrows)
{   
    unsigned char *ptr;
    FILE *fp;

    if ( (fp = fopen(fname, "rb")) == NULL)
        KLTError("(pgmReadFile) Can't open file for reading");

    ptr = pgmRead(fp, img, ncols, nrows);

    fclose(fp);

    return ptr;
} 


Wat is hier precies de output van als je het om moet zetten naar Java? Ik dacht zelfs byte[] maar dat pakt ie niet.

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht


Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
Jaaaaaa, maar dat heb ik al uitgeplozen. Ik kom er echt niet zelf uit.

Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-09 00:06
Het lijkt erop dat je een portable gray map bestand wil lezen. Volgens de specificatie zelf is het formaat zo simpel dat het onzinnig is om daarvoor een C library met JNA te gebruiken. Het is goed te doen om hiervoor gewoon in Java een parser voor te schrijven.

Zie ook http://stackoverflow.com/...o-read-pgm-images-in-java

[ Voor 11% gewijzigd door matthijsln op 25-04-2012 09:27 ]


Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
matthijsln schreef op woensdag 25 april 2012 @ 09:26:
Het lijkt erop dat je een portable gray map bestand wil lezen. Volgens de specificatie zelf is het formaat zo simpel dat het onzinnig is om daarvoor een C library met JNA te gebruiken. Het is goed te doen om hiervoor gewoon in Java een parser voor te schrijven.

Zie ook http://stackoverflow.com/...o-read-pgm-images-in-java
Het probleem is alleen dat ik die output van pgmReadFile nodig heb voor andere functies.

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

ALs ik op die link die ik je gaf kijk zie ik:

pointer (e.g. void*) platform-dependent (32- or 64-bit pointer to memory) Buffer / Pointer

Wat snap je daar niet aan? Zo te zien kan je het Java type Pointer en/of Buffer gebruiken. Heb je die al geprobeerd?

zie bijvoorbeeld ook:
http://stackoverflow.com/...ich-can-map-char-of-c-dll

Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
Dus de return is een pointer?

Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-09 00:06
RabbitHeart schreef op woensdag 25 april 2012 @ 09:40:
[...]
Het probleem is alleen dat ik die output van pgmReadFile nodig heb voor andere functies.
Je kan in Java de PGM inlezen en een JNA Buffer gebruiken voor het KLT_PixelType *img argument voor die andere functies, lijkt me.

Acties:
  • 0 Henk 'm!

  • RabbitHeart
  • Registratie: April 2012
  • Laatst online: 21-05 20:41
matthijsln schreef op woensdag 25 april 2012 @ 10:26:
[...]


Je kan in Java de PGM inlezen en een JNA Buffer gebruiken voor het KLT_PixelType *img argument voor die andere functies, lijkt me.
Hoe doe je dat ongeveer?

Dus ik lees die buffer in volgens de methode die in jouw linkje staat.
Dan heb ik een int[][] . Hoe gebruik ik dan die buffer?

Sorry dit gaat allemaal ver boven mijn pet :'( . Mijn superviser weet ook niet hoe het moet en zei dat ik dit maar uit moest zoeken.
Pagina: 1