Objekt aus einem Objekt mit JNI in C
public class Student
{
private People people;
private Result result;
private int amount;
}
Hier ist die Beispiel-Klasse in Java; in C, habe ich versucht, die "Menschen" in "Student", aber ich konnte nicht. Allerdings bin ich in der Lage zu bekommen int-Typ "Betrag" von "Student".
jobject getObjectFromObject(JNIEnv *env, jobject obj, const char * fieldName)
{
jfieldID fid; /* store the field ID */
jobject i;
/* Get a reference to obj's class */
jclass cls = (*env)->GetObjectClass(env, obj);
/* Look for the instance field s in cls */
fid = (*env)->GetFieldID(env, cls, fieldName, "L");
if (fid == NULL)
{
return 0; /* failed to find the field */
}
/* Read the instance field s */
i = (*env)->GetObjectField(env, obj, fid);
return i;
}
Ich versuche zu überholen "Menschen" als Feldname in der Methode, aber es gibt noch die folgende Fehlermeldung: "java.lang.NoSuchFieldError: Menschen"
ich habe fix den Typ der Signatur, indem die Paket-Namen.Aber immer noch nicht mein Problem behoben
InformationsquelleAutor user1151874 | 2013-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dokumentiert hier, in der
GetFieldID
Methode, die Sie nicht verwenden können, "L" allein als eine Art Signatur, müssen Sie den Klassennamen angeben danach.Zum Beispiel, wenn Sie angeben möchten, dass das argument ein
String
, müssen SieLjava/lang/String;
(Das abschließende Semikolon ist Teil der Signatur!).Für Ihre benutzerdefinierte Klasse mit dem Namen
People
, angenommen es ist in der Verpackungyour.package.name
, müssen SieLyour/package/name/People;
als eine Art Signatur.Sie haben die Verwendung der Paketname, nicht den Pfad.
Schauen Sie in Ihren
People.java
- Datei, es muss mit etwas beginnen, wiepackage your.package.name;
. Konvertieren Sie die Punkte "/" und haben Sie einen gültigen Typ-Signatur. WennPeople
ist eine innere Klasse vonStudent
ich denke, Sie haben zur Trennung der "äußeren" Klasse aus der inneren Klasse mit einem$
: verwenden SieLyour/package/name/Student$People;
Paket testen.jni.bean;
code
dies ist meine package-Namen, so dass ich umgebaut fid = (*env)->GetFieldID(env, cls, "fieldName", "Ltest/jni/bean/Student$Leute;");code
aber immer noch java.lang.NoSuchFieldError: Menschenjedenfalls habe ich Fix mein Problem
code
fid = (*env)->GetFieldID(env, cls, "fieldName", "Ltest/jni/bean/Leute;");code
einfach das Paket von der Klasse vergessen, die äußere Klasse "Student"InformationsquelleAutor mbrenon