Set<type>Field Routines - SetBooleanField
void
Set<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID,
NativeType value);
This family of accessor routines sets the value of an instance (nonstatic) field of an object. The field to access is specified by a field ID obtained by calling
GetFieldID()
. (SetBooleanField)
The following table describes the Set<type>Field routine name and value type. You should replace type in Set<type>Field with the Java type of the field, or use one of the actual routine names from the table, and replace NativeType with the corresponding native type for that routine.
Table 4-2a Set<type>Field Family of Accessor Routines
LINKAGE:
Indices in the JNIEnv interface function table.
Table 4-2b Set<type>Field Family of Accessor Routines
PARAMETERS:
env
: the JNI interface pointer.obj
: a Java object (must not be NULL
).fieldID
: a valid field ID.value
: the new value of the field.
Example - SetBooleanField
class classthree { private static native Response dem2euro(Request in_req); public static void main(String[] args) { Request req = new Request(); req.whrg_betrag = (long)(Math.random() * 1000); req.whrg_kuerzel = "DEM"; //classthree c = new classthree(); //c.dummy = 9898; //Response resp = c.calc(req); Response resp = dem2euro(req); if (resp.calc_erfolgreich) { System.out.println("Ergebnis=" + resp.euro_betrag + " Euro, " + "konvertiert aus " + req.whrg_betrag + " " + resp.whrg_langbezeichnung); } else { System.out.println("Kein DEM Betrag zum Konvertieren " + "vorhanden"); } } static { System.loadLibrary("three"); } } class Request { long whrg_betrag; String whrg_kuerzel; } class Response { double euro_betrag; boolean calc_erfolgreich; String whrg_langbezeichnung; } |
Die hierin referenzierte C Library "three.c" (Listing 6) ist für die Konvertierung von DEM-Beträgen in Euro zuständig.
#include <jni.h> #include <stdio.h> #include "classthree.h" JNIEXPORT jobject JNICALL Java_classthree_dem2euro(JNIEnv *env, jclass in_cls, jobject in_request) { double dem_rate_c = 1.95583; double exchange_rate_c = 0.0; long whrg_betrag_c = 0; const char *whrg_kuerzel_c; double euro_betrag_c = 0.0; int calc_erfolgreich_c = 0; char whrg_langbezeichnung_c[30]; jclass jcls; jfieldID jfid; jmethodID jmid; jobject jobj; /* Die Klasse des übergebenen Objektes bestimmen: */ jcls = (*env)->GetObjectClass(env,in_request); /* Die Adresse des Feldes "whrg_betrag" in dem übergebenen Objektes ermitteln: */ jfid = (*env)->GetFieldID(env, jcls, "whrg_betrag", "J"); /* Den Wert des Feldes "whrg_betrag" auslesen: */ whrg_betrag_c = (*env)->GetLongField(env, in_request, jfid); jfid = (*env)->GetFieldID(env, jcls, "whrg_kuerzel", "Ljava/lang/String;"); whrg_kuerzel_c = (*env)->GetStringUTFChars(env, (jstring)((*env)->GetObjectField(env,in_request, jfid)),NULL); /* Nur Konvertieren wenn DEM Betrag */ if (!strcmp(whrg_kuerzel_c,"DEM")) { euro_betrag_c = whrg_betrag_c / dem_rate_c; calc_erfolgreich_c = 1; strcpy(whrg_langbezeichnung_c,"Deutsche Mark"); } /* Klassendefinition für Klasse "Response" suchen: */ jcls = (*env)->FindClass(env, "Response"); if (jcls == NULL) { printf("Error FindClass\n"); return NULL; } /* Adresse des Konstruktors der Klasse "Response" ermitteln: */ jmid = (*env)->GetMethodID(env, jcls, "<init>","()V"); if (jmid == NULL) { printf("Error GetMethodID\n"); return NULL; } /* Neues Objekt der Klasse "Response" erzeuegen und initialisieren: */ jobj = (*env)->NewObject(env, jcls, jmid); if (jobj == NULL) { printf("Error NewObject\n"); return NULL; } /* Adresse des Feldes "euro_betrag" in dem neuen Objekt ermitteln: */ jfid = (*env)->GetFieldID(env, jcls, "euro_betrag", "D"); /* Wert des Feldes "euro_betrag" in dem neuen Objekt füllen: */ (*env)->SetDoubleField(env, jobj, jfid, euro_betrag_c); jfid = (*env)->GetFieldID(env, jcls, "calc_erfolgreich", "Z"); (*env)->SetBooleanField(env, jobj, jfid, calc_erfolgreich_c); jfid = (*env)->GetFieldID(env, jcls, "whrg_langbezeichnung", "Ljava/lang/String;"); (*env)->SetObjectField(env, jobj, jfid, (*env)->NewStringUTF(env, whrg_langbezeichnung_c)); /* Neues Objekt zurückgeben: */ return jobj; } |