2013-10-16 2 views
0

J'ai la fonction JNI suivante qui envoie un événement à mon code Java.Fonction JNI provoquant l'application Android à Crash

void onIncrementAchievement(unsigned char _iArgumentCount, const void *_pArguments, void *_pUserData){ 
JNIEnv *pJNIEnv = GetJNIEnv(); 
if (pJNIEnv){ 

     if (_pArguments && (_iArgumentCount > 0)){ 
       const S3DX::AIVariable *pVariables = (const S3DX::AIVariable *)_pArguments ; 

       if(_iArgumentCount != 2) 
         LOGI("INCORRECT NUMBER OF PARAMETERS"); 
       else{ 
         if(pVariables[0].GetType() == S3DX::AIVariable::eTypeString){ 
           // CHANGE ME! 
           jclass pJNIActivityClass = pJNIEnv->FindClass ("com/nurfacegames/testgame01/TestGame01"); 

           if(pJNIActivityClass == NULL) 
             LOGI("jclass was null!?!"); 
           else{ 
             jmethodID pJNIMethodID = pJNIEnv->GetStaticMethodID(pJNIActivityClass, "onIncrementAchievement", "(Ljava/lang/String;Ljava/lang/Integer;)V"); 

             if(pJNIMethodID == NULL) 
               LOGI("jmethodID was null!?!?"); 
             else{ 
               //Create a new string 
               jstring arg; 
               arg = pJNIEnv->NewStringUTF(pVariables[0].GetStringValue()); 

               jint arg2 = pVariables[1].GetNumberValue(); 

               //Call the method and pass the string parameter along 
               pJNIEnv->CallStaticVoidMethod(pJNIActivityClass, pJNIMethodID, arg, arg2); 
               //Free the string 
               pJNIEnv->DeleteLocalRef(arg); 
             } 
           } 
         } 
       } 
     } 
} 
} 

Quand je lance mon application Android, il ferme la force sans même une seule erreur dans logcat, et quand je compilez avec Ant, il y a compilation aucune erreur. Je déteste publier une question aussi vague, mais si quelqu'un a une idée de ce qui ne va pas avec mon code JNI, donnez-moi un indice. Merci!

Les domaines que je pense avoir un problème (que je travaille sur) sont:

if(_iArgumentCount != 2) 
         LOGI("INCORRECT NUMBER OF PARAMETERS"); 
       else{ 

et cette section:

jint arg2 = pVariables[1].GetNumberValue(); 

pJNIEnv->CallStaticVoidMethod(pJNIActivityClass, pJNIMethodID, arg, arg2); 

Merci!

Répondre

1

Eh bien, regardez votre nom de la méthode void onIncrementAchievement, pour autant que je sache, ce n'est pas la bonne façon de déclarer votre méthode dans la section native, il devrait être:

Java_com_example_yourpackagename_youractivityname_yourmethod(...) 

Et une chose, les arguments dans votre méthode sont également faux je suppose, consultez this tutorial.