Obtenez de l'objet à partir d'un objet avec de la JNI dans C
public class Student
{
private People people;
private Result result;
private int amount;
}
Voici l'exemple de la classe en Java, en C, j'ai essayé d'obtenir le "peuple", "Étudiant", mais j'ai échoué. Cependant, je suis en mesure d'obtenir le type int "montant" à partir de "l'Étudiant".
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;
}
Je suis en train de passer "peuple" comme un nom de champ dans la méthode, mais il donne toujours l'erreur suivante: "java.lang.NoSuchFieldError: les personnes"
j'ai corrigé le type de signature en passant le nom du package.Mais parvenez toujours pas à résoudre mon problème
OriginalL'auteur user1151874 | 2013-04-03
Vous devez vous connecter pour publier un commentaire.
Comme documenté ici, dans le
GetFieldID
méthode, vous ne pouvez pas utiliser "L" tout seul comme un type de signature, vous devez spécifier le nom de la classe par la suite.Par exemple, si vous souhaitez indiquer que l'argument est un
String
, vous aurez à utiliserLjava/lang/String;
(Le point-virgule final est partie de la signature!).Pour votre classe personnalisée nommée
People
, à supposer qu'il est dans le paquetyour.package.name
, vous aurez à utiliserLyour/package/name/People;
comme une signature de type.Vous devez utiliser le nom du package, et non pas le chemin.
Regardez dans votre
People.java
fichier, il doit commencer avec quelque chose commepackage your.package.name;
. Convertir les points et "/" et vous aurez un type valide la signature. SiPeople
est un intérieur de classe deStudent
, je pense que vous aurez à séparer les "externes" de la classe de l'intérieur de la classe à l'aide d'un$
: utilisationLyour/package/name/Student$People;
package test.jni.fève;
code
ces est mon nom de package, donc j'ai converti en fid = (*env)->GetFieldID(env, cls, fieldName, "Ltest/jni/haricot/Étudiant$People;");code
mais encore java.lang.NoSuchFieldError: les gensde toute façon j'ai résolu mon problème,
code
fid = (*env)->GetFieldID(env, cls, fieldName, "Ltest/jni/haricot/Personnes;");code
juste de donner à l'ensemble de la classe, oubliez l'extérieur de la classe de "l'Étudiant"OriginalL'auteur mbrenon