# C++ Dateien oder .dll Dateien einbinden



## thomas.g (31. Mrz 2005)

Hi, 

Ich stoße immer wieder auf Dinge, die in C ausführbar sind, und in Java nicht.

Deswegen möchte ich mich mit JNI beschäftigen, doch habe keine Ahnung davon.
Ich kann mit den Tutorials und Dingen, die man mit Google und von Sun findet nichts anfangen, da ich noch nie damit gearbeitet habe.

Deswegen möchte ich wissen, ob man C++ Dateien in Java verwenden kann, also die Methoden der C++ Datei!

Ich wäre sehr dankbar, wenn mir jemand ein kleines beispiel per E-Mail schicken könnte, wo eine C++ Datei 2 Zahlen bekommt, und diese Zahlen zusammenzählt und wieder zurückgibt.

Naja ich weiß, dass das in Java geht, doch für ein einfaches Beispiel ist dies gut geignet!

Danke, Thomas G


E-Mail: thomas.guettinger@aon.at


----------



## Bert Brenner (31. Mrz 2005)

Nun, direkt kann man C++ Dateien nicht verwenden.

Diese müssen schon in Form einer Library vorliegen .dll oder .so

Ich musste mich grade letztens auch mit JNI auseinandersetzen. Das Material über JNI ist recht spärlich gesäht.

Um die von dir gestellte Aufgabe zu lösen sollte das Wissen was in "Java ist auch eine Insel" vermittelt wird locker reichen.

Ich werd mal schaun ob ich da ein wenig Code für dich basteln kann.


----------



## Bert Brenner (31. Mrz 2005)

Ich glaub zwar nicht das dieses Beispiel dir viel hilft. Aber bitte sehr:


Die Java Klasse:


```
package jniadd;

public class JNIAdd {

  public static native int addInt (int a, int b);

  public static void main(String[] args) {
    System.loadLibrary("JNIADD");
    System.out.println(addInt(5,8));
  }
}
```

Die mit javah erstellte HeaderDatei:


```
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jniadd_JNIAdd */

#ifndef _Included_jniadd_JNIAdd
#define _Included_jniadd_JNIAdd
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     jniadd_JNIAdd
 * Method:    addInt
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_jniadd_JNIAdd_addInt
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif
```

Die implementation der Methoden aus der HeaderDatei:


```
#include <jni.h>
#ifndef _Included_jniadd_JNIAdd
#define _Included_jniadd_JNIAdd
#ifdef __cplusplus
extern "C" {
#endif

/*
 * Class:     jniadd_JNIAdd
 * Method:    addInt
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_jniadd_JNIAdd_addInt
(JNIEnv *, jclass, jint a, jint b){
	return a+b;
}

#ifdef __cplusplus
}
#endif
#endif
```


----------



## Guest (31. Mrz 2005)

Noch ein anderes Beispiel (Zeit seit dem Booten des PCs ermitteln)
Boottime.java
	
	
	
	





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

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

  public static void main(String argv[]) {
    System.out.println(getBoottime());
  }
}
```
boottime.c

```
#include <jni.h>
#include <windows.h>
#include "boottime.h"

JNIEXPORT jlong JNICALL Java_Boottime_getTickCount(JNIEnv *env, jclass obj) {
  return GetTickCount();
}
```
build.bat (hier vc++ compiler verwendet)

```
@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 /Ot -LD boottime.c -Feboottime.dll
```


----------



## Roar (31. Mrz 2005)

thomas.g hat gesagt.:
			
		

> Ich stoße immer wieder auf Dinge, die in C ausführbar sind, und in Java nicht.



na, soviel kann das doch nicht sein, oder?


----------



## Guest (31. Mrz 2005)

Roar hat gesagt.:
			
		

> thomas.g hat gesagt.:
> 
> 
> 
> ...


Hehe  Nur die ganze Windows API.


----------



## thomas.g (31. Mrz 2005)

naja, ist aber mehr, wie zum Beispiel Laufwerke öffnen, Festplatte steuern (naja, braucht man nicht so) ......


----------

