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