Microsoft Standard Compiler

Status
Nicht offen für weitere Antworten.

SammY

Bekanntes Mitglied
Hi Leute,

kann mir jemand den Link posten wo ich den Microsoft Standard Compiler downloaden kann.

Bräuchte in für JNI.


Danke.

Mfg SammY
 
Weiß net, am besten ist du saugst das Studio runter!

hast eine IDE auch gleich mit dabei!

Ist ne abgespeckte gratis Version von MS!
 
Jo, wie gesagt, saug die Express Version, da ist der Compiler dabei. Du brauchst die IDE gar nicht anzurühren, sondern nur die cl.exe suchen. 😉
 
Das hab ich ja schon alles gemacht.
Hab die cl.exe schon.

Wie muss ich denn nach einander vor gehen damit ich eine dll in ein java programm einbinden kann?
 
Hab jetzt alles soweit hinbekommen.
Bekomm nur noch den bekannten UnsatisfiedLink error.

Ich poste mal meine Dateien vielleicht erkennt ihr den fehler.

Hier die Java-Datei:

Code:
public class JNI_Ausgabe{
	public native String Ausgabe(int i);
	public static void main(String[] args){
		new JNI_Ausgabe().Ausgabe(10);
	}
	static {
		System.loadLibrary("c_ausgabe");
	}
}

Und hier die C-Datei:

Code:
#include "JNI_Ausgabe.h"
#include <stdio.h>
#include <jni.h>

JNIEXPORT void JNICALL Ausgabe(JNIEnv *env, jobject obj, jdouble wert){
	printf("Ergebnis: %10.3lf\n", wert);
}

Und hier noch der Fehler:

C:\jni>java JNI_Ausgabe
Exception in thread "main" java.lang.Unsatisfied
at JNI_Ausgabe.Ausgabe(Native Method)
at JNI_Ausgabe.main(JNI_Ausgabe.java:4)

Schauts euch bitte mal an.

Danke
Gruß SammY
 
Hier ein simples Beispiel

Boottime.java
Code:
import java.util.Date;

public class Boottime
{
  static 
  {
    System.loadLibrary("boottime");
  }
  private static native long getTickCount();

  public static Date getBoottime()
  {
    return new Date(System.currentTimeMillis()-Boottime.getTickCount());
  }

  public static void main(String argv[])
  {
    System.out.println(getBoottime());
  }
}
Boottime.c
Code:
#include <jni.h>
#include <windows.h>
#include "boottime.h"

JNIEXPORT jlong JNICALL Java_Boottime_getTickCount(JNIEnv *env, jclass obj)
{
  return GetTickCount();
}
build.bat
Code:
@echo off
%JAVA_HOME%\bin\javac.exe Boottime.java
%JAVA_HOME%\bin\javah.exe Boottime
cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 /GD -LD boottime.c -Feboottime.dll
 
Vielen Dank für eure Hilfe. Habs auch schon hinbekommen.

Ich hab vor eine kleine Anleitung dazu zu schreiben.
Könnte man die dann vielleicht zu den FAQs hier im Forum stellen, weil dieses Thema ja öfter gebraucht wird und immer wieder die gleichen Fehler auftreten. 😀
Wer weis denn an wen ich mich da wenden muss?? ???:L

Gruß SammY.
 
Wenn man einfach die IDE nimmt, anstatt auf der Konsole rumzuhacken ist das eigentlich kein Problem 😀


Aber kannst ruig machen, können wir dann reinhängen!

Ich persönlich würde mich über eine Linux FAQ für JNI freuen, da ich noch nie eine .so Datei zum Laufen gebracht habe, bzw noch nie etwas mit dem gcc Compilier geschafft habe (weder in Linux noch Windows).

Er kann die GCC dll´s/so´s einfach net laden..
 
Das gleiche Problem hatte ich auch. Hab mit dem gcc nichts zum Laufen gebracht. Wenn ich damit dann fertig bin versuch ich das ganze mal unter Linux zum Laufen zu bringen.

so far
 
Hi Leute,

da ich wieder mal das Problem mit den JNI's hatte und ewig lang brauche ne vernünftige Anleitung zu
finden habe ich mir gedacht ich mach mal selber was.

Damit ihr auch was davon habt poste ich sie hier. 😀




Schritt für Schritt Anleitung zum Erstellen eines JNI’s (Java Native Interfaces)



Übersicht:
1. Ein Java Programm schreiben. Diese Klasse enthält die deklarierte native Me-thode.
2. Kompilieren der Java – Klasse welche die „Main“ -und die „Native“ Methode enthält
3. Generieren der Header-Datei für die „Native“ Methode. Dazu wird javah mit der Flag –jni benutzt.
4. Schreiben der Implementierung der „Native“ Methode in einer Programmier-sprache wie z.B. C oder C++.
5. Kompilieren der Header –und der Implementierungsdatei in ein „shared library file“.
6. Ausführen des Java Programms.


Schritt 1: Schreiben des Javacodes.
Schritt 2: Kompilieren des Javacodes.
Schritt 3: .h File erzeugen(Headerdatei)
Schritt 4: Schreiben der Implementierung der „Native“ Methode
Schritt 5: Erzeugen der Shared Library
Schritt 6: Ausführen des Programms



Schritt 1: Schreiben des Javacodes.

Der folgende Javacode definiert eine Klasse namens HelloWorld. Diese Klasse dekla-riert eine Native Methode und implementiert die „Main“ Methode.
Code:
	class HelloWorld {
    		public native void displayHelloWorld();

    		static {
        		System.loadLibrary("hello");
    		}
    
    		public static void main(String[] args) {
        		new HelloWorld().displayHelloWorld();
    		}
	}
Sobald eine Methode aus einer anderen Sprache implementiert wird, muss das Schlüsselwort native verwendet werden.
Code:
	public native void displayHelloWorld();
Das Runtime Environment läd später die dll in die Java Klasse die sie benötigt.
Die HelloWorld Klasse benutzt die System.loadLibrary Methode. Diese Methode läd die dll in das Programm.



Schritt 2: Kompilieren des Javacodes

Benutze den Javacompiler um die Klasse zu kompilieren welche Sie im Schritt vorher erstellt haben.

Javac HelloWorld.java



Schritt 3: .h File erzeugen


In diesem Schritt nutzen Sie das javah Programm um das Headerfile zu erzeugen.
Das Headerfile wird folgendermaßen erzeugt:

Javah –jni HelloWorld

Das erzeugte Headerfile:
Code:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif



Die Java_HelloWorld_displayHelloWorld – Funktion stellt die Schnittstelle zur nativen Methode displayHelloWorld in der Klasse HelloWorld zur Verfügung.
Der Aufbau des Funktionsnamen Java_HelloWorld_displayHelloWorld setzt sich fol-gendermaßen zusammen:

Java_, der Packetname, der Klassenname, Name der „Native“ Methode. Zwischen jeden dieser Komponenten muss ein Unterstrich sein “_“.

In diesem Beispiel wird kein Packetname benötigt da sich die Dateien im default Pa-cket befinden, welcher keinen Namen hat.



Schritt 4: Schreiben der Implementierung der „Native“ Methode

Nun wird die Schnittstelle für die „Native“ Methode geschrieben. Hier die in C ge-schriebene Schnittstelle für die „Native“ Methode Java_HelloWorld_displayHelloWorld
Diese Schnittstelle befindet sich in der Datei HelloWorldImp.c:
Code:
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL 
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 
{
    printf("Hello world!\n");
    return;
}


Schritt 5: Erzeugen der Shared Library

In Schritt eins wurde durch System.loadLibrary(„hello“) die Shared Library ins Java-programm eingebunden. In Windows wird eine dll – Datei erstellt. Nun erstellen wir diese. Sie können mit dem Compiler von Windows die Shared Library mit folgenden Kommando erzeugen.

Cl –Ic:\java\include –Ic:\java\include\win32
–LD HelloWorldImp.c –Fehello.dll



Schritt 6: Ausführen des Programms

Jetzt können Sie das Programm mit dem Java Interpreter ausführen.

Java HelloWorld

Nun sollten Sie folgende Ausgabe sehen:

Hello World!

Wenn Sie die folgende Fehlermeldung bekommen, haben Sie den Library Pfad nicht richtig gesetzt.



Ich hoffe mit dieser kurzen Anleitung somanchen von euch geholfen zu haben. 😀
Also viel Spaß und Erfolg damit.

MFG

SammY
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben