C source to Java Source -> compile java layer?

Status
Nicht offen für weitere Antworten.

nipnip

Mitglied
Hallo zusammen,

habe eine Problem, wo ich aufgrund von Unwissen nicht weiter komme.

ich habe ein kleines Program mit Source bekommen, welches jedoch in C geschrieben ist. Jetzt steht in einer Datei folgendes:

"[...]The library includes an optional Java layer. You can compile the C library on its own, or you can compile both the C library and the Java layer. In order to compile the Java layer, you will need the following packages. [...]
- Apache Oro regular expressions[...]
- JUnit test framework[...]
- Gnu Getopt[...]"

So, jetzt meine Frage:

Was ist ein Java Layer?
Wie kann ich diesen kompilieren?
Wie bekomme ich damit den Source in Java zum laufen?

Ich hoffe, ich könnte mir ein paar Ansätze geben, damit wär mir schon sehr geholfen.

Danke und mfg

nipnip

€dit:

Ich habe das soweit verstanden, dass ich eine dll vom C Source erzeugen muss, die ich dann via JNI in Java verwenden kann. Soweit so gut, nur habe ich keine Ahnung, wie da ran gehe bzw. wie ich die dll verwende, sofern ich sie denn kompiliert bekomme...

€dit2:

Ich denke, wenn ich dieses Kapitel lese, bin ich auf dem richtigen Weg, Einwände?

Galileo Computing :: Java ist auch eine Insel – 26 Java Native Interface (JNI)
 
Zuletzt bearbeitet:
Kann ich denn, wenn ich die dll habe und diese in Java lade(System.loadLibrary()), die von der dll zur Verfügung stehenden Methoden abrufen? Also wenn mir z.B. eine dll unbekannt ist?

€dit:

Vielleicht ist auch mein Ansatz falsch.

Also ich habe den C-Sourcecode und bereits eine komplilierte Exe mit einer dazugehörigen dll-Datei. Muss ich irgendetwas neu kompilieren, oder kann ich einfach diese vorhandene dll in Java nutzen?

Ich habe eine Klasse geschrieben, die den Prototypen einer Methode der dll entspricht:

Java:
public class ESim {

	static
       {
		System.load("C:/temp/xeq.dll");
	}
	
	public native static void Calculate(String str, String str2, String str3, int int1, double double1);
}

Nun rufe ich in meiner Main Klasse die Methode der ESim Klasse auf:

Java:
ESim.Calculate("", "", "", 0, 0);

Ist das so korrekt oder muss ich das irgendwie anders machen?. Bekomme nämlich den Fehler:

Java:
Exception in thread "main" java.lang.UnsatisfiedLinkError: ESim.Calculate(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ID)V
 
Zuletzt bearbeitet:
Offenbar gibt es die Methode Calculate mit dieser Signatur nicht in deiner DLL.
- Ist es wirklich "Calculate" und nicht "calculate"?
- Wie müssen die Strings übergeben werden? Kann es z.B. sein, dass du char-Arrays mit angehängter '\0' oder so brauchst?

Irgendwo sollte doch ein entsprechendes Header-File für das JNI stehen, kannst du das mal suchen und posten?
 
Also in der .h Datei, wo die Methode aufgerufen wird, steht sie so drin:

Java:
// Calculate using either method one or exhaustive enumeration.
int Calculate(const char* one, const char* two, const char* three, __int64 numberOfTrials, double* results);

€dit: Zusätzliche Frage: Muss eine dll neu kompiliert werden(per javah usw.), um sie in Java nutzen zu können?
 
Zuletzt bearbeitet:
€dit: Zusätzliche Frage: Muss eine dll neu kompiliert werden(per javah usw.), um sie in Java nutzen zu können?

Deine DLL scheint gar keine von Java benutzbaren Funktionen zu haben:

Java:
// Calculate using either method one or exhaustive enumeration.
int Calculate(const char* one, const char* two, const char* three, __int64 numberOfTrials, double* results);

Das sieht nach standard Cpp aus. In Deiner Header Datei müsste sowas stehen wie:

Java:
JNIEXPORT jint JNICALL Calculate
  (JNIEnv *, jobject, jlong, jstring, jstring, jstring, jint, jdouble);


Asonsten ist Dein Ansatz richtig:

Java:
public class ESim {

	static
       {
		System.load("C:/temp/xeq.dll");
	}
	
	public native static void Calculate(String str, String str2, String str3, int int1, double double1);
}


Es kann also durchaus sein, daß Du Deine DLL mit den javaspezifischen Header Files neukompilieren mußt, damit das Ganze funktioniert.
 
Zuletzt bearbeitet:
Das denke ich auch, danke für deine Antwort. Aber wie erstelle ich jetzt aus dem C Code eine Dll mit diesem java header?

Ich habe im Internet immer nur Beispiele gefunden, in denen aus einem Java-source heraus ein c-header generiert wurde(javah). Wie mache ich das denn, wenn ich den c-source habe?
 
Das denke ich auch, danke für deine Antwort. Aber wie erstelle ich jetzt aus dem C Code eine Dll mit diesem java header?

Ich habe im Internet immer nur Beispiele gefunden, in denen aus einem Java-source heraus ein c-header generiert wurde(javah). Wie mache ich das denn, wenn ich den c-source habe?

Ich kenne es auch nur auf diesem Wege 🙂. Du wirst wahrscheinlich alles per Hand umbauen müssen. Oder (wenn Du weißt, was Du tust), dann generierst Du Dir einen Header aus einem Java Dummy Code (indem Du nur die ganzen Methoden deklarierst) und nimmst diese Datei als Grundlage. Allerdings müssen die Methodenrümpfe im C, bzw. C++ Code selbst auch javafähig sein (d.h. mit dem ganzen JNI Gefrickel drumrum). Ist das der Fall, in der zugehörigen CPP, bzw C Datei?
 
Zuletzt bearbeitet:
Außer JNI gibt es noch das JNA Projekt, mit dem man DLLs "einfach so" aufrufen können soll. Hab's noch nicht getestet, aber vielleicht hilft's ja ...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben