# JNI Datentypen



## MQue (13. Okt 2009)

Morgen,

ich programmier gerade mit dem JNI und mir sind die Datentypen, welche zwischen Java und C konvertiert werden müssen, nicht ganz klar.


```
JNIEXPORT jstring JNICALL Java_Calc_pow (JNIEnv *env, jobject obj, jstring s, jdouble d2)
{
const char * str = (*env)—>GetStringUTFChars(env,s,0);
```

Weiß jemand was das env ist und was GetStringUTFChars genau macht,
env dürfte meiner Meinung nach ein Zeiger auf eine Struktur sein,
mit (*env) greif ich auf die Struktur zu und mit -> dann auf die einzelnen Attribute der Struktur, 
Kann das sein und was kann ich eigentlich mit jobject obj machen?

lg


----------



## Marco13 (13. Okt 2009)

Env ist das "Environment", sozusagen die Java-Laufzeitumgebung - die Haupklasse für die Interaktion zwischen Java und C. Env hat aber AFAIK keine Attribute, sondern stellt nur die Methoden bereit, die man für diese Interaktion braucht - z.B. sich Arrayelemente zu holen, Methoden auf Java-Objekten aufzurufen ... oder Java-Strings in C-char*s umzuwandeln - und letzteres macht man mit der Methode GetStringUTFChars

Das jobject dort ist das Objekt, auf dem die Methode aufgerufen wurde. D.h. bei sowas wie

```
class Foo
{
    native void someFunction();
}

Foo foo = new Foo();
foo.function();
```
ist das Objekt, das dort ankommt, gerade das "foo". Man kann dann auf Attribute und weitere Methoden des Objektes zugreifen. 

Du solltest diesbezüglich ein Tutorial lesen.


----------



## MQue (13. Okt 2009)

>> Methoden auf Java-Objekten aufzurufen

Super, das Hilft mir schon einiges weiter, hab schon ein Tutorial gelesen und komme mit dem jetztigen Wissen leicht über die Runden.
Eines ist mir noch nicht ganz klar, was ist der Unterschied zwischen jni und jna,
das ist mir noch nicht ganz klar,
lg und danke,


----------



## Marco13 (13. Okt 2009)

JNI und JNA sind zueinander wie ein Huhn und ein Hund ... ja, die ersten beiden Buchstaben sind gleich ... Naja, mal im ernst: GANZ grob vereinfacht: Mit JNI kann man eigenen C-Code schreiben und von Java aus ausführen lassen. Mit JNA kann man von Java aus auf eine _bereits existierende_ C-Bibliothek zugreifen.


----------

