JNI - FindClass fonction retourne null
J'ai une simple classe java ("MainX") que j'ai compiler à l'aide d'un script shell et eclipse. Quand j'invoque l'env->FindClass("MainX") en fonction de la MainX.class fichier généré par le script renvoie la valeur null, alors que le MainX.class fichier généré à partir d'eclipse. renvoie la classe et l'exécute par la suite, le runMainX fonction.
Générés MainX.class fichier se trouve dans le même dossier que la JNI C++ exécutable.
MainX.java
public class MainX {
public static void main(String[] args) {
//TODO Auto-generated method stub
System.out.println(new MainX().runMainX());
}
public String runMainX(){
return ("0.789");
}
}
JNIBinding.cpp
#define USER_CLASSPATH "."
....
....
JNIEnv* createVM (JavaVM **jvm)
{
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1]; //holds various JVM optional settings
options[0].optionString = const_cast<char*>("-Djava.class.path="USER_CLASSPATH);
vm_args.version = JNI_VERSION_1_6; //version of Java platform
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
/* load and initialize a Java VM, return a JNI interface * pointer in env */
long status = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
if (status == JNI_ERR){
cout << "Fail: Unable to load JVM \t Exit" << endl;
}
else if (status == JNI_OK){
cout << "CreateVM:\t\tJVM loaded successfully!" << endl ;
}
delete options;
return env;
}
....
....
float invokeMainX(JavaVM **jvm, JNIEnv *env){
jclass mainClass ; //Returns a class object from a fully-qualified name, or NULL if the class cannot be found.
jmethodID classConstructor; //Returns the method ID for an instance (nonstatic) method of a class
jobject classObject; //Constructs a new java object
jmethodID methodid;
float outcome = 0;
mainClass = env->FindClass("MainX"); //Returns a class object from a fully-qualified name, or NULL if the class cannot be found.
if (mainClass==0) return 0;
classConstructor = env->GetMethodID(mainClass, "<init>", "()V"); //Returns the method ID for an instance (nonstatic) method of a class
if (classConstructor==0) return -1;
classObject = env->NewObject(mainClass, classConstructor); //Constructs a new java object
if (classObject==0) return -2;
methodid = env->GetMethodID(mainClass, "runMainX", "()Ljava/lang/String;");
if (methodid==0) return -3;
jstring result = (jstring)env->CallObjectMethod(classObject, methodid); //returns the result of the calling method, an object
....
....
}
Quelqu'un pourrait-il m'expliquer pourquoi cela se produit?
J'apprécie toute l'aide.
Une idée??? Merci d'avance
OriginalL'auteur STiGMa | 2013-10-01
Vous devez vous connecter pour publier un commentaire.
De la JNI Documentation pour
FindClass
:Donc, en supposant que la classe est dans le package
your.package.name
, je suppose que vous aurez à remplaceravec
Espérons que cette aide!
Je vois. Aucune idée, je suis habitué à l'utilisation de JNI dans l'Android contexte où les colis sont obligatoires pour autant que je sais...
OriginalL'auteur mbrenon
Je ne suis pas sûr de ce problème sur votre plate-forme, mais j'ai eu un problème similaire sur la plate-forme Android.
La FindClass méthode doit être appelée à partir de fil de Java. FindClass de la mise en œuvre est à la recherche d'un chargeur de classe en parcourant le courant de la pile des appels. Depuis que vous essayez d'appeler le FindClass à partir d'un thread natif, il n'y a pas de chargeur de classe de chercher.
Jetez un oeil à ce JNI FAQ:
OriginalL'auteur Ivan Mushketyk
J'ai CentOS 6 x86_64 et ça ne fonctionne pas jusqu'à ce que j'ai modifié cette ligne:
aussi j'ai besoin de export LD_LIBRARY_PATH:
J'espère que cela aide!
OriginalL'auteur oml