Newsgroup: it.comp.java
Titolo: Inserimento di codice nativo C in un programma Java

So che non sarebbe una buona soluzione per tutti i vari motivi di
sicurezza, ma visto che le javacomm non esistono per linux mi trovo
obbligato ad usare questa soluzione, macchinosa, ma sempre più facile di
programmare in C un ambiente a finestre per X.
Detto questo passo subito alla spiegazione di quello che voglio fare: ho
una sceda che, connessa via porta parallela, pilota otto interruttori
ognuno legato ad un bit della parallella.
Per fare questo ho usato i seguenti file (sotto riportati):
1)interruttori.java che gestisce l'interfaccia grafica del programma
2)interruttori.h ottenuto con javah interruttori.java
3)interruttori.c ottenuto con javah -stubs interruttori.java
4)attiva.c e disattiva.c in cui definisco le due funzioni per gestire
gli interruttori
Questi due file sono ancora da completare, ma mi viene un dubbio e
volevo chiedere a voi. Seguendo le indicazioni di Naughton nel file
attiva.c mi ritrovo con la funzione
void interruttori_attiva(struct Hinterruttori *this) {
....
}
Questo passa automaticamente il parametro int della funzione nel file
interruttori.java
public native void attiva(int interruttore);  
oppure devo fare qualche conversione? 
Grazie per l'aiuto, anche perché sono che deve essere un po' pesante
arrivare alla fine del messaggio
*** inizio file interruttori.java
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.io.*;
class interruttori extends Frame {
	static interruttori inter;
	static String lsuno     = new String("Uno: spento");
	static String lsdue     = new String("Due: spento");
	static String lstre     = new String("Tre: spento");
	static String lsquattro = new String("Quattro: spento");
	static String lscinque  = new String("Cinque: spento");
	static String lssei     = new String("Sei: spento");
	static String lssette   = new String("Sette: spento");
	static String lsotto    = new String("Otto: spento");
	static String launo     = new String("Uno: acceso");
	static String ladue     = new String("Due: acceso");
	static String latre     = new String("Tre: acceso");
	static String laquattro = new String("Quattro: acceso");
	static String lacinque  = new String("Cinque: acceso");
	static String lasei     = new String("Sei: acceso");
	static String lasette   = new String("Sette: acceso");
	static String laotto    = new String("Otto: acceso");
 
        static Button uno     = new Button(lsuno);
	static Button due     = new Button(lsdue);
	static Button tre     = new Button(lstre);
	static Button quattro = new Button(lsquattro);
	static Button cinque  = new Button(lscinque);
	static Button sei     = new Button(lssei);
	static Button sette   = new Button(lssette);
	static Button otto    = new Button(lsotto);
 
	static Panel bottoni1 = new Panel();
	static Panel bottoni2 = new Panel();
 
	static Button fine = new Button("                      
Esci                      ");
 
	interruttori() {
		setBounds (10,10,232,150);
		setLayout(new FlowLayout(FlowLayout.CENTER));
		bottoni1.setLayout(new GridLayout(4,1));
		bottoni2.setLayout(new GridLayout(4,1));
		bottoni1.add(uno);
		bottoni1.add(due);
		bottoni1.add(tre);
		bottoni1.add(quattro);
		bottoni2.add(cinque);
		bottoni2.add(sei);
		bottoni2.add(sette);
		bottoni2.add(otto);
 
		add(bottoni1);
		add(bottoni2);
		add(fine);
	}
 
	public boolean handleEvent(Event evtObj) {
                if (evtObj.id == Event.WINDOW_DESTROY)
                        System.exit(0);
                return super.handleEvent(evtObj);
        }
 
	public boolean action(Event evtObj, Object arg) {
		if (evtObj.target instanceof Button) {
			if (arg.equals("Uno: spento")) {
				uno.setLabel(launo);
			}
			if (arg.equals("Due: spento")) {
				due.setLabel(ladue);
			}
			if (arg.equals("Tre: spento")) {
				tre.setLabel(latre);
			}
			if (arg.equals("Quattro: spento")) {
				quattro.setLabel(laquattro);
			}
			if (arg.equals("Cinque: spento")) {
				cinque.setLabel(lacinque);
			}
			if (arg.equals("Sei: spento")) {
				sei.setLabel(lasei);
			}
			if (arg.equals("Sette: spento")) {
				sette.setLabel(lasette);
			}
			if (arg.equals("Otto: spento")) {
				otto.setLabel(laotto);
			}
			if (arg.equals("Uno: acceso")) {
				uno.setLabel(lsuno);
			}
			if (arg.equals("Due: acceso")) {
				due.setLabel(lsdue);
			}
			if (arg.equals("Tre: acceso")) {
				tre.setLabel(lstre);
			}
			if (arg.equals("Quattro: acceso")) {
				quattro.setLabel(lsquattro);
			}
			if (arg.equals("Cinque: acceso")) {
				cinque.setLabel(lscinque);
			}
			if (arg.equals("Sei: acceso")) {
				sei.setLabel(lssei);
			}
			if (arg.equals("Sette: acceso")) {
				sette.setLabel(lssette);
			}
			if (arg.equals("Otto: acceso")) {
				otto.setLabel(lsotto);
			}
			if (arg.equals("                       Esci                      "))
{
				java.lang.System.exit(0);
			}
			return true;
		}
		return false;
	}
 
	static { System.loadLibrary("interruttori");
	}
 
	public native void attiva(int interruttore);
	public native void disattiva(int interruttore);
 
	public static void main(String args[]) {
                inter = new interruttori();
                inter.setTitle("Pilota interruttori");
                inter.show();
        }
}
*** fine file interruttori.java ***
*** inizio file interruttori.h ***
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <native.h>
/* Header for class interruttori */
#ifndef _Included_interruttori
#define _Included_interruttori
struct Hjava_awt_peer_ComponentPeer;
struct Hjava_awt_Container;
struct Hjava_awt_Color;
struct Hjava_awt_Font;
struct Hjava_awt_Cursor;
struct Hjava_util_Locale;
struct Hjava_util_Vector;
struct Hjava_lang_String;
struct Hjava_awt_Dimension;
struct Hjava_awt_event_ComponentListener;
struct Hjava_awt_event_FocusListener;
struct Hjava_awt_event_KeyListener;
struct Hjava_awt_event_MouseListener;
struct Hjava_awt_event_MouseMotionListener;
struct Hjava_awt_Component;
struct Hjava_awt_LayoutManager;
struct Hjava_awt_LightweightDispatcher;
struct Hjava_awt_event_ContainerListener;
struct Hjava_awt_event_WindowListener;
struct Hsun_awt_im_InputContext;
struct Hjava_awt_FocusManager;
struct Hjava_awt_Image;
struct Hjava_awt_MenuBar;
#pragma pack(4)
typedef struct Classinterruttori {
    struct Hjava_awt_peer_ComponentPeer *peer;
    struct Hjava_awt_Container *parent;
    int32_t x;
    int32_t y;
    int32_t width;
    int32_t height;
    struct Hjava_awt_Color *foreground;
    struct Hjava_awt_Color *background;
    struct Hjava_awt_Font *font;
    struct Hjava_awt_Cursor *cursor;
    struct Hjava_util_Locale *locale;
    /*boolean*/ int32_t visible;
    /*boolean*/ int32_t enabled;
    /*boolean*/ int32_t valid;
    struct Hjava_util_Vector *popups;
    struct Hjava_lang_String *name;
    /*boolean*/ int32_t nameExplicitlySet;
/* Inaccessible static: LOCK */
    struct Hjava_awt_Dimension *minSize;
    struct Hjava_awt_Dimension *prefSize;
    /*boolean*/ int32_t newEventsOnly;
    struct Hjava_awt_event_ComponentListener *componentListener;
    struct Hjava_awt_event_FocusListener *focusListener;
    struct Hjava_awt_event_KeyListener *keyListener;
    struct Hjava_awt_event_MouseListener *mouseListener;
    struct Hjava_awt_event_MouseMotionListener *mouseMotionListener;
#undef interruttori_actionListenerK
#define interruttori_actionListenerK 706L
#undef interruttori_adjustmentListenerK
#define interruttori_adjustmentListenerK 716L
#undef interruttori_componentListenerK
#define interruttori_componentListenerK 729L
#undef interruttori_containerListenerK
#define interruttori_containerListenerK 738L
#undef interruttori_focusListenerK
#define interruttori_focusListenerK 764L
#undef interruttori_itemListenerK
#define interruttori_itemListenerK 821L
#undef interruttori_keyListenerK
#define interruttori_keyListenerK 875L
#undef interruttori_mouseListenerK
#define interruttori_mouseListenerK 900L
#undef interruttori_mouseMotionListenerK
#define interruttori_mouseMotionListenerK 903L
#undef interruttori_textListenerK
#define interruttori_textListenerK 977L
#undef interruttori_windowListenerK
#define interruttori_windowListenerK 989L
    int64_t eventMask;
/* Inaccessible static: isInc */
/* Inaccessible static: incRate */
#undef interruttori_TOP_ALIGNMENT
#define interruttori_TOP_ALIGNMENT 0f
#undef interruttori_CENTER_ALIGNMENT
#define interruttori_CENTER_ALIGNMENT 0.5f
#undef interruttori_BOTTOM_ALIGNMENT
#define interruttori_BOTTOM_ALIGNMENT 1f
#undef interruttori_LEFT_ALIGNMENT
#define interruttori_LEFT_ALIGNMENT 0f
#undef interruttori_RIGHT_ALIGNMENT
#define interruttori_RIGHT_ALIGNMENT 1f
#undef interruttori_serialVersionUID
#define interruttori_serialVersionUID -7644114512714619750LL
    int32_t componentSerializedDataVersion;
    int32_t ncomponents;
    struct HArrayOfObject *component;
    struct Hjava_awt_LayoutManager *layoutMgr;
    struct Hjava_awt_LightweightDispatcher *dispatcher;
    struct Hjava_awt_Dimension *maxSize;
    struct Hjava_awt_event_ContainerListener *containerListener;
#undef interruttori_serialVersionUID
#define interruttori_serialVersionUID 4613797578919906343LL
    int32_t containerSerializedDataVersion;
    struct Hjava_lang_String *warningString;
#undef interruttori_OPENED
#define interruttori_OPENED 1L
    int32_t state;
    struct Hjava_awt_event_WindowListener *windowListener;
    /*boolean*/ int32_t active;
    struct Hsun_awt_im_InputContext *inputContext;
    struct Hjava_awt_FocusManager *focusMgr;
#undef interruttori_base
#define interruttori_base 407L
/* Inaccessible static: nameCounter */
#undef interruttori_serialVersionUID
#define interruttori_serialVersionUID 4497834738069338734LL
    int32_t windowSerializedDataVersion;
#undef interruttori_DEFAULT_CURSOR
#define interruttori_DEFAULT_CURSOR 0L
#undef interruttori_CROSSHAIR_CURSOR
#define interruttori_CROSSHAIR_CURSOR 1L
#undef interruttori_TEXT_CURSOR
#define interruttori_TEXT_CURSOR 2L
#undef interruttori_WAIT_CURSOR
#define interruttori_WAIT_CURSOR 3L
#undef interruttori_SW_RESIZE_CURSOR
#define interruttori_SW_RESIZE_CURSOR 4L
#undef interruttori_SE_RESIZE_CURSOR
#define interruttori_SE_RESIZE_CURSOR 5L
#undef interruttori_NW_RESIZE_CURSOR
#define interruttori_NW_RESIZE_CURSOR 6L
#undef interruttori_NE_RESIZE_CURSOR
#define interruttori_NE_RESIZE_CURSOR 7L
#undef interruttori_N_RESIZE_CURSOR
#define interruttori_N_RESIZE_CURSOR 8L
#undef interruttori_S_RESIZE_CURSOR
#define interruttori_S_RESIZE_CURSOR 9L
#undef interruttori_W_RESIZE_CURSOR
#define interruttori_W_RESIZE_CURSOR 10L
#undef interruttori_E_RESIZE_CURSOR
#define interruttori_E_RESIZE_CURSOR 11L
#undef interruttori_HAND_CURSOR
#define interruttori_HAND_CURSOR 12L
#undef interruttori_MOVE_CURSOR
#define interruttori_MOVE_CURSOR 13L
    struct Hjava_lang_String *title;
    struct Hjava_awt_Image *icon;
    struct Hjava_awt_MenuBar *menuBar;
    /*boolean*/ int32_t resizable;
    /*boolean*/ int32_t mbManagement;
    struct Hjava_util_Vector *ownedWindows;
#undef interruttori_base
#define interruttori_base 224L
/* Inaccessible static: nameCounter */
#undef interruttori_serialVersionUID
#define interruttori_serialVersionUID 2673458971256075116LL
    int32_t frameSerializedDataVersion;
/* Inaccessible static: inter */
/* Inaccessible static: lsuno */
/* Inaccessible static: lsdue */
/* Inaccessible static: lstre */
/* Inaccessible static: lsquattro */
/* Inaccessible static: lscinque */
/* Inaccessible static: lssei */
/* Inaccessible static: lssette */
/* Inaccessible static: lsotto */
/* Inaccessible static: launo */
/* Inaccessible static: ladue */
/* Inaccessible static: latre */
/* Inaccessible static: laquattro */
/* Inaccessible static: lacinque */
/* Inaccessible static: lasei */
/* Inaccessible static: lasette */
/* Inaccessible static: laotto */
/* Inaccessible static: uno */
/* Inaccessible static: due */
/* Inaccessible static: tre */
/* Inaccessible static: quattro */
/* Inaccessible static: cinque */
/* Inaccessible static: sei */
/* Inaccessible static: sette */
/* Inaccessible static: otto */
/* Inaccessible static: bottoni1 */
/* Inaccessible static: bottoni2 */
/* Inaccessible static: fine */
} Classinterruttori;
HandleTo(interruttori);
#pragma pack()
#ifdef __cplusplus
extern "C" {
#endif
extern void interruttori_attiva(struct Hinterruttori *,int32_t);
extern void interruttori_disattiva(struct Hinterruttori *,int32_t);
#ifdef __cplusplus
}
#endif
#endif
*** fine file interruttori.h ***
*** inizio file interruttori.c ***
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <StubPreamble.h>
/* Stubs for class interruttori */
/* SYMBOL: "interruttori/attiva(I)V", Java_interruttori_attiva_stub */
stack_item *Java_interruttori_attiva_stub(stack_item *_P_,struct execenv
*_EE_) {
	extern void interruttori_attiva(void *,int32_t);
	(void) interruttori_attiva(_P_[0].p,((_P_[1].i)));
	return _P_;
}
/* SYMBOL: "interruttori/disattiva(I)V",
Java_interruttori_disattiva_stub */
stack_item *Java_interruttori_disattiva_stub(stack_item *_P_,struct
execenv *_EE_) {
	extern void interruttori_disattiva(void *,int32_t);
	(void) interruttori_disattiva(_P_[0].p,((_P_[1].i)));
	return _P_;
}
*** fine file interruttori.c ***
*** inizio file attiva.c ***
/* file contenente l'implementazione di attiva*/
#include <StubPreamble.h>
#include "interruttori.h"
#include <stdio.h>
void interruttori_attiva(struct Hinterruttori *this) {
 
}
*** fine file attiva.c ***
*** inizio file disattiva.c ***
/* file contenente l'implementazione di disattiva*/
#include <StubPreamble.h>
#include "interruttori.h"
#include <stdio.h>
void interruttori_disattiva(struct Hinterruttori *this) {
 
}
*** fine di disattiva.c ***

 [...]
Non ho avuto il tempo di leggere tutto il codice accuratamente; da
quello che viene fuori (ad esempio usi -stubs) pare che tu non stia
usando JNI. Poco male comunque: cio' che non capisco e' che tu ti
aspetti una funzione con un int come parametro, mentre
l'implementazione C dichiara solo this (che e' il famoso parametro
"nascosto" di tutte le chiamate nonstatic). Se stessi usando JNI
dovresi avere un jint - o l'equivalente (non ricordo piu') in 1.0NI.
Questa mi pare un'incongruenza. Del resto, e' da quando e' uscita la
1.1 che non uso piu' la vecchia interfaccia nativa di 1.0 - quindi
prendi il tutto con le molle - del resto io mi riguardo la guida di JNI
ogni volta che devo usarla personalmente.. :)
-cs
--
God is Real, unless declared Integer
Sent via Deja.com 
http://www.deja.com/
Share what you know. Learn what you don't.

Grazie per avermi risposto.
Il problema è propio quello: leggendo sul mio libro ho trovato questo,
ma non sono sicuro che sia giusto. A me interessa che alle due funzioni
ic C arrvi il parametro int che ho dichiarato nel file java. Cosa
faccio?
Una nota che può tornare utile se mi risponidi: io uso il JDK1.1.6 sotto
linux, forse è per quello che ci sono i problemi on JNI, ammesso che non
so che cosa sia, purtroppo
Ciao e grazie
-- 
----------------------------------------------------------------
Windows 98: 16 million lines of code that will never be debugged
----------------------------------------------------------------


Be', il primo responso te lo da il compilatore, poi la JVM quando
carichi la libreria e infine l'esecuzione vera e propria. :)
In ogni caso, JNI sta per Java Native Interface, ed e'un modo per
scrivere codice nativo indipendente dalla JVM bersaglio (e quindi
dipendente solo dalla piattaforma, ma non dalla particolare JVM sulla
piattaforma).
Il metodo e' il solito: dichiari "native" i metodi che vuoi, compili,
usi javah sul .class e ottieni un header file con i prototipi delle
funzioni C/C++ da implementare.
Tutti i tipi java (primitivi, object, arrays) sono mappati in
tipi/classi C corrispondenti - in dipendenza dalla piattaforma - e
accedi al tutto attreverso un puntare ad una classe (o un array di
puntatori a funzione a seconda che usi C++ o C) che incapsula la JVM.
La cosa e' dettagliatamente spiegata nella documentazione del JDK (in
inglese, temo) e funziona bene.
Non so purtroppo se la JVM 1.1.6 di Linux abbia gia' il supporto a JNI,
ma ad occhio dovrebbe.. prova a vedere le opzioni di javah - se c'e' un
"-jni" e' ok.
--


 inglese, temo) e funziona bene.
Non è un problema.
Ti ringrazio
