Zum Inhalt springen

Java über JNI zum C


Zonbléou

Empfohlene Beiträge

Hallo Leute,

jetzt bin ich einbischen überfordert und bitte ich deswegen um eure Hilfe. Ich arbeite mit Eclipse cdt, MinGW und MSYS. CDT für C/C++ Umgebung, MinGW für GNU(c und c++ Compiler unter Windows). MSYS nur um einige Funktionalitäten von LINUX benutzen zu können.

Für ein Projekt wurde eine Software in C geschrieben und es gibt auch die DLL für C die zur Verfügung stehen. Ich habe außerdem ein paar Header Dateien die Funktionsprototypen enthalten. Mittlerweile habe ich auch ein Toll installiert(Dependency Walker) um die DLL Funktionen lesen zu können.

Jetzt meine Aufgabe ist einigen Methoden aus C-DLL für eine Berechnung aufzurufen.

Ich habe dafür diese Methoden als native Methoden in meiner Java Programm deklariert:

package triangleberechner;


public class Triangulationsberechnung {


	static{

		System.loadLibrary("libDMASCProg");


	}



	public static  void main(String[] args) {


		int drob = 1;

		int dobj = 1;

		 String initial =  "null";

		boolean rohdatenzeile = true;

		boolean zeit = true;

		byte[] input64 = new byte[32];


		try{

			System.out.println("Ausführung von java Programm mit nativen Methoden!!!");


			Triangulationsberechnung triangle = new Triangulationsberechnung();

			triangle._mcbe_InitBerechnung_setDebugOptions(drob, dobj, initial, rohdatenzeile, zeit);

			triangle._mcbe_RechneMitZeile(input64);

		}

		catch(UnsatisfiedLinkError ex){

			ex.printStackTrace();

			System.out.println("Message:" + ex.getMessage());

			System.out.println("CRASHBOOMBANG!!!");

		}


	}


		public  native  <AnsiString> void _mcbe_InitBerechnung_setDebugOptions(int bitmask_chkbox_drob, 

											int bitmask_chkbox_dobj, 

											AnsiString filter_text,

											boolean chkbox_n_rohdatenzeile, 

											boolean chkbox_zeit); 		// (struct mcb_dbgopt_S o)

		public native  void _mcbe_RechneMitZeile(byte[] input64);	//(unsigned char * input64)


}

Aus diesem Java Programm könnte ich meine Header Datei für C erstellen:
/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class triangleberechner_Triangulationsberechnung */


#ifndef _Included_triangleberechner_Triangulationsberechnung

#define _Included_triangleberechner_Triangulationsberechnung

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     triangleberechner_Triangulationsberechnung

 * Method:    _mcbe_InitBerechnung_setDebugOptions

 * Signature: (IIZZ)V

 */

JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1InitBerechnung_1setDebugOptions

  (JNIEnv *, jobject, jint, jint, jobject, jboolean, jboolean);


/*

 * Class:     triangleberechner_Triangulationsberechnung

 * Method:    _mcbe_RechneMitZeile

 * Signature: ([B)V

 */

JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile

  (JNIEnv *, jobject, jbyteArray);


#ifdef __cplusplus

}

#endif

#endif


Bzw. meine Wrapper C Datei schreiben, obwohl die nicht ganz fertig geschrieben.
/*

 * Triangleberechner.c

 *

 *  Created on: 17.03.2009

 *      Author: SBX825

 */

#include <jni.h>

#include "triangleberechner_Triangulationsberechnung.h"

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

//#include <d_cal12.h>

//#include <cpp_asrt.h>

//#include <d_calopt.h>

//#include <d_calpdf.h>

//#include <dyn_d_cal12.h>

//#include <tmp_pdf.h>


JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1InitBerechnung_1setDebugOptions

  (JNIEnv *env, jobject obj, jint in_int1, jint in_int2, jstring in_str, jboolean in_bool1, jboolean in_bool2)

{

		char buf[128];

	// Java String in C-String konvertieren und an C-Variablen zuweisen

		const char *c_string = (*env)->GetStringUTFChars(env, in_str, 0);

		printf("%d %d %s %d %d\n",  in_int1, in_int2, c_string, in_bool1, in_bool2);


		//_mcbe_InitBerechnung_setDebugOptions(in_int1, in_int2, c_string, in_bool1, in_bool2); //struct mcbe_dbgopt_S o

		strcpy (buf, c_string);

		strcat(buf, "Greeting from C!");

		(*env)->ReleaseStringUTFChars(env, in_str, c_string);


		return ;//(*env)->NewStringUTF(env, buf);

}


JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile

  (JNIEnv *env, jobject obj, jbyteArray jarr)

{

	// Der Array muss mit seiner Länge übernommen werden

		//jsize l = (*env)->GetArrayLength(env, jarr);

		jbyte *input64 = (*env)->GetByteArrayElements(env, jarr, 0);


		/*Aufruf der Methode mcbe_1RechneMitZeile in der Bibliothek Triangulationsberechnung.dll

		 * dieses C-File muß in der gleichen Bibliothek zur Verfügung stehen.

		 * */

		//jarr = (*env)->_mcbe_1RechneMitZeile(input64);

		//jarr = (*env)->_mcbe_RechneMitZeile(input64);




		// Speicher freigeben und rückkopieren des Arrays

		(*env)->ReleaseByteArrayElements(env, jarr, input64, 0);

}

Anschließend habe ich auch mein DLL für java der den Zugriff auf ermöglichen kann erstellt. Den habe ich ich auch in meiner java klasse geladen und das funktioniert denn über printf() könnte ich ein Output in der Konsol lesen. Alle Dll und Header von C sind auch unter Eclipse eingebunden.

Aber mein Ziel ist das zu bekommen was in dem Rumpf von C-Methoden implementiert ist. Meine Frage jetzt ist wie mache ich die Aufrufe von benötigen Methoden aus C-Dll? Wo paasiert das und was brauche ich dafür?

Brauche ich eigentlich die C-Header in meiner C-Wrapper zu inkludieren?

Ich hoffe wirklich auf eure Hilfe.

Vielen Dank im voraus.

Zonbléou

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mittels JNI habe ich schon diverse C++ Funktionalitäten eingebunden, aber ich verstehe leider Deine Fragen nicht.

Könntest Du bitte die Fragen etwas verallgemeinern, denn mir fehlt das tatsächliche Problem?

Oder geht es um das prinzipielle Handling von JNI, dann ist das aber viel zu viel Text :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

klar ich weiss, dass es keinen Spaß macht das ganze zu lesen. Aber ich wollte das ganze deutlich darstellen damit man versteht was ich so tue.

Ich versuche jetzt mein problem ganz allgemein zu beschreiben.

Ich will das ganze so bauen, dass ich das statisch linke. Ich habe die C-DLLs und die Header, die zum Erzeugen von diese DLLs gebraucht worden.

Ich habe schon meine JNIDLL erzeugt. Wie kann ich das ganze zusammen bringen, dass die Funktionen aus C-DLLs benutzt werden?

Vielen Dak nochmal für Deine Mühe meine Fragen zu verstehen.

Zonbléou

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

zum Glück bist Du noch Online und vielleicht hast Du noch bischen Zeit.

Ich habe das hier versucht:

JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile

  (JNIEnv *env, jobject obj, jbyteArray jarr)

{

	jint HINSTANCE;

	// Der Array muss mit seiner Länge übernommen werden

		//jsize l = (*env)->GetArrayLength(env, jarr);

		jbyte *input64 = (*env)->GetByteArrayElements(env, jarr, 0);


		/*Aufruf der Methode mcbe_1RechneMitZeile in der Bibliothek Triangulationsberechnung.dll

		 * dieses C-File muß in der gleichen Bibliothek zur Verfügung stehen.

		 * */


		 LoadLibrary("d_cal12.DLL");



		// Speicher freigeben und rückkopieren des Arrays

		(*env)->ReleaseByteArrayElements(env, jarr, input64, 0);

}
und ich kriege so was als fehlermeldung:
(.text+0x117): undefined reference to `_LoadLibrary'

collect2: ld returned 1 exit status

kannst Du mir dann dabei helfen wie ich diese Loadlibrary(), benutzte und getAdresse Methoden?

Vielen Dank nochmal.

Zonbléou

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo nochmal,

ich habe den Pfad von kernel32 gesucht und das verlinken über MinGw wie vorher beschrieben versucht und ich kriege so was als Fehlermeldung:

Warning: resolving _Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile by linking to _Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile@12

src\Triangleberechner.o:Triangleberechner.c:(.text+0x117): undefined reference to `_LoadLibrary'

C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(w32-shared-ptr.o).text+0x31): undefined reference to `__imp__GetAtomNameA@12'

C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(w32-shared-ptr.o).text+0x159): undefined reference to `__imp__FindAtomA@4'

C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(w32-shared-ptr.o).text+0x2b1): undefined reference to `__imp__AddAtomA@4'

C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(w32-shared-ptr.o).text+0x2d2): undefined reference to `__imp__FindAtomA@4'

collect2: ld returned 1 exit status

Build error occurred, build is stopped[/code]

Gibt eine Möglichkeit weiter zu helfen?

Grüße.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo nochmal,

ich habe den Pfad von kernel32 gesucht und das verlinken über MinGw wie vorher beschrieben versucht und ich kriege so was als Fehlermeldung:

Entweder hast du nicht beschrieben, wie du kernel32.lib gelinkt hast, oder ich finde diese Beschreibung nicht. Wie auch immer, du hast es offenbar falsch gemacht, denn die Linkerfehler verweisen ausnahmslos auf Funktionen aus kernel32.dll.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich weiss nicht genau wie ich das richtig machen kann. Ich arbeite mit eclipse cdt und MinGW. Unter Project -> Properties -> C/C++Builder -> Settings habe und dann MinGW C Linker -> Libraries habe ich unter Libraries(-l) kernel32 eingefügt und unter Libraries search path(-L) habe ich C:\WINDOWS\system32 und dann C:\WINDOWS\W32api eingefügt.

Ich weiss, dass es falsch sein kann aber nur so kann man mir helfen.

Danke nochmal.

Zonbléou

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten morgen Herren,

ich hoffe störe gerade nicht. Ich habe am Freitag versucht zu beschreiben wie ich mein

kernel32.dll und kernel32.lib eingefügt habe. Ich hoffe das kann man verstehen. Wenn Sie bischen Zeit haben, schauen Sie, ob Sie mir weiter helfen können. Da bin ich gerade blockiert.

Vielen Dank.

Zonbléou

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich habe es immer noch nicht richtig. Die libkernel32.a die ich gefunden habe bezieht sich auf dem MinGW. Ich weiss nicht, ob ich da richtig bin. Außerdem ich denke da brauche irgendeine .a lib von meiner JNI-DLL.

Könnten Sie mir bei diesen Begriffe helfen?

In meinem MinGW C Linker -> hared Library Settings unter dem Eclipse habe ich folgende Begriffe gefunden und ich weiss nicht auf welchen DLL sie sich beziehen; auf meine erzeugte JNI-DLL oder auf die C-DLL?

- Shared object name, -Import Library name, und -DEF file name. Bitte um Hilfe, bin Anfänger.

Danke.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich habe es immer noch nicht richtig.
Dieselben Fehler, oder andere?

Die libkernel32.a die ich gefunden habe bezieht sich auf dem MinGW.
Ja und? Das ist in Ordnung.

Außerdem ich denke da brauche irgendeine .a lib von meiner JNI-DLL.
Nein, soweit ich weiß, nicht.

In meinem MinGW C Linker -> hared Library Settings unter dem Eclipse habe ich folgende Begriffe gefunden und ich weiss nicht auf welchen DLL sie sich beziehen; auf meine erzeugte JNI-DLL oder auf die C-DLL?

- Shared object name, -Import Library name, und -DEF file name.

Da ich davon ausgehen, dass du die C-DLL nicht selbst erstellst, handelt es sich um die JNI-DLL.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

am Anfang sehen Sie die libs und dll die ich eingefügt habe und dann die fehlermeldungen am Ende.

**** Build of configuration Release for project DMASCProg ****

**** Internal Builder is used for build ****

gcc ../src/Triangleberechner.def -LC:\Dokumente und Einstellungen\SBX825\Desktop\Rohdata -LC:\MinGW\lib -shared -Wl,-soname=libDMASCProg -Wl,--out-implib=libDMASCProg -Wl,--output-def=Triangleberechner -olibDMASCProg.dll src\Triangleberechner.o -ld_caldbg -lborlndmm -lcc3260 -lcc3260mt -lstlp45 -ld_cal12 -lvcand32 -lDetSys_001

Creating library file: libDMASCProg

Warning: resolving _Java_triangleberechner_Triangulationsberechnung__1mcbe_1InitBerechnung_1setDebugOptions by linking to _Java_triangleberechner_Triangulationsberechnung__1mcbe_1InitBerechnung_1setDebugOptions@28

Use --enable-stdcall-fixup to disable these warnings

Use --disable-stdcall-fixup to disable these fixups

Warning: resolving _Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile by linking to _Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile@12

src\Triangleberechner.o:Triangleberechner.c:(.text+0x117): undefined reference to `_LoadLibrary'

src\Triangleberechner.o:Triangleberechner.c:(.text+0x123): undefined reference to `_LoadLibrary'

src\Triangleberechner.o:Triangleberechner.c:(.text+0x12f): undefined reference to `_LoadLibrary'

src\Triangleberechner.o:Triangleberechner.c:(.text+0x137): undefined reference to `__mcbe_1RechneMitZeile'

collect2: ld returned 1 exit status

Build error occurred, build is stopped

Time consumed: 375 ms.

Ich lese auch gerade die FAQ von MinGW aber hilft mir nicht so viel.

Vielleicht kriege ich das irgendwann und habe ich auch viel gelernt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

was mache ich jetzt falsch? Ich bin erschöpft. Sollte ich irgendwas in dieser Methode als Rumpf implementieren? Falls ja, können Sie mir ein Bsp. geben? Jesdes Mal, wenn ich versuche "LoadLabrary()" aufzurufen oder eine Methode aus der C-DLL zum Bsp. "_mcbe_RechneMitZeile(parameter)" aufzurufen, ich kriege immer dieser undefined reference to '_LoadLibrary' Fehlermeldung.

Ohne irgendeinen Aufruf compilier Fehlerfrei.

Ich weiss nicht was ich machen soll.

Bitte um Bsp.

Z.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jesdes Mal, wenn ich versuche "LoadLabrary()" aufzurufen oder eine Methode aus der C-DLL zum Bsp. "_mcbe_RechneMitZeile(parameter)" aufzurufen, ich kriege immer dieser undefined reference to '_LoadLibrary' Fehlermeldung.
Dann hast du die Importbibliothek für kernel32.dll immer noch nicht richtig dazugelinkt.

Die Funktionen aus der C-DLL wirst du sowieso nicht direkt aufrufen können, weil du für diese DLL keine Importbibliothek hast. Du musst dir mit LoadLibrary/GetProcAddress die Funktionszeiger aus der DLL holen und diese aufrufen.

Ohne irgendeinen Aufruf compilier Fehlerfrei.
Logisch. Wenn du keine Funktionen aus kernel32.dll benutzt, brauchst du sie auch nicht.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo noch einmal,

ich störe jetzt schon zu viel aber entschuldigen Sie. Ich habe nach dem Beispiel von jemandem aus Internet es so gemacht:

projects->properties->C/C++Build->Settings->Tool Settings->MinGW C++ Linker-->Miscellaneous->Other Objects und neuen adden mit dem link "C:\MinGW\lib\libkernel32.a" .

und dan unter lib Im -> Settings->Directory den Namen von kernel32.dll eingefügt. Können Sie mir bei der Deklaration von LoadLibrary() und GetProcAdress() helfen indem Sie mir ein Bsp. geben? Die Bsp. aus Internet sind mit irgend INSTANCE Variablen gebaut und ich komme nicht klar damit.

Vielen Dank im voraus.

Z.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Herren,

wie Sie merken, Sie sind der einzige der mir bei dem Thema helfen können. Mein letzter Einbinden von kernel32.dll und libkernel32.a scheint funktioniert zu haben. Außerdem musste ich noch "windows.h" inkludieren. Meine LoadLibrary/GetProcAddress habe ich wie folgt implementiert:

typedef void (*FNPTR)(char*);

typedef jbyte (*pFunc) (jbyte input64)

HINSTANCE hIns;

pFunc pFn;

jbyte input64[] = {2,4};

hIns = LoadLibrary("d_cal12.DLL");

if(hIns)

{

pFn = (pFunc)GetProcAddress(hIns,"_mcbe_RechneMitZeile");

FreeLibrary(hIns);

}

system("PAUSE");

Es gibt keine Reference Beschwerden mehr.

Meine .a, .def Dateien wurden erzeugt. Im .def-Datei kann man alle exports Funktionen von meinem JNI-DLL und Import C-DLL und deren Funktionen sehen.

Meine Frage; es bedingt noch Aufrufe von C-DLL Methoden im meinem Wrapper-Datei? Wie sehe ich die endgültige Ergebnisse oder ob der Aufruf funktioniert hat?

Vielleicht die letzte Störung.

Danke für Deine Gedult. Ich gebe noch die Implementierung einer Methode mit und zeigen Sie mir das was fehlt.

JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile

(JNIEnv *env, jobject obj, jbyteArray jarr)

{

HINSTANCE hIns;

pFunc pFn;

jbyte input64[] = {2,4};

hIns = LoadLibrary("d_cal12.DLL");

if(hIns)

{

pFn = (pFunc)GetProcAddress(hIns,"_mcbe_RechneMitZeile");

FreeLibrary(hIns);

}

system("PAUSE");

// Speicher freigeben und rückkopieren des Arrays

(*env)->ReleaseByteArrayElements(env, jarr, input64, 0);

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mittels JNI habe ich schon diverse C++ Funktionalitäten eingebunden, aber ich verstehe leider Deine Fragen nicht.

Könntest Du bitte die Fragen etwas verallgemeinern, denn mir fehlt das tatsächliche Problem?

Oder geht es um das prinzipielle Handling von JNI, dann ist das aber viel zu viel Text :D

Mein letzter Einbinden von kernel32.dll und libkernel32.a scheint funktioniert zu haben. Außerdem musste ich noch "windows.h" inkludieren. Meine LoadLibrary/GetProcAddress habe ich wie folgt implementiert:

typedef void (*FNPTR)(char*);

typedef jbyte (*pFunc) (jbyte input64)


HINSTANCE hIns;

pFunc pFn;

jbyte input64[] = {2,4};

hIns = LoadLibrary("d_cal12.DLL");

if(hIns)

{

pFn = (pFunc)GetProcAddress(hIns,"_mcbe_RechneMitZeile") ;

FreeLibrary(hIns);

}

system("PAUSE"); 
Es gibt keine Reference Beschwerden mehr. Meine .a, .def Dateien wurden erzeugt. Im .def-Datei kann man alle exports Funktionen von meinem JNI-DLL und Import C-DLL und deren Funktionen sehen. Meine Frage; es bedingt noch Aufrufe von C-DLL Methoden im meinem Wrapper-Datei? Wie sehe ich die endgültige Ergebnisse oder ob der Aufruf funktioniert hat? Vielleicht die letzte Störung. Danke für Deine Gedult. Ich gebe noch die Implementierung einer Methode mit und zeigen Sie mir das was fehlt.
JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1 mcbe_1RechneMitZeile

(JNIEnv *env, jobject obj, jbyteArray jarr)

{



HINSTANCE hIns;

pFunc pFn;

jbyte input64[] = {2,4};

hIns = LoadLibrary("d_cal12.DLL");

if(hIns)

{

pFn = (pFunc)GetProcAddress(hIns,"_mcbe_RechneMitZeile") ;

FreeLibrary(hIns);

}

system("PAUSE");



// Speicher freigeben und rückkopieren des Arrays

(*env)->ReleaseByteArrayElements(env, jarr, input64, 0);

} 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zwischen GetProcAddress und FreeLibrary fehlt der Aufruf der Funktion.

Der Funktionszeigertyp pFunc muss auf die Signatur der Funktion passen. Die sollte ja aus der Headerdatei der C-DLL hervorgehen. Ich glaube nicht, dass der richtig ist, denn eine C-Funktion dürfte kaum jbyte als Parameter- oder Rückgabetyp haben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin auch ganz neu zu C und weiss deswegen nicht wie ich das richtig programmieren kann. Wegen Der Funktionszeigertyp pFunc; wie mache ich das? So heisst die Funktion im Header:

extern "C" void DLL_EXP mcbe_RechneMitZeile(unsigned char * input64);

Wenn ich der Aufruf von "mcbe_RechneMitZeile(char* input64)" versuche dann kriege eine Fehlermeldung, daß die Structure ist nicht enthalten.

Naja sicher funktioniert das irgendwie!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wegen Der Funktionszeigertyp pFunc; wie mache ich das?
So:

typedef void(*pFunc)(unsigned char*);
Wenn ich der Aufruf von "mcbe_RechneMitZeile(char* input64)" versuche dann kriege eine Fehlermeldung, daß die Structure ist nicht enthalten.
mcbe_RechneMitZeile ist ja auch kein gültiger Bezeichner an dieser Stelle. Du musst die Funktion über den Funktionszeiger aufrufen. Das könnte so aussehen:
pFunc( input64 );

Das heißt, falls das Array input64 als Parameter für diese Funktion gedacht ist. jbyte könnte auf unsigned char passen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...