2013-03-25 5 views
5

Voglio effettuare una chiamata da C++ a Java. Provo a chiamare una funzione che riattacca un valore bool, senza parametri.JNI restituisce la funzione Signal 7 cercando di chiamare Java da C++

Questo è il mio C++ Codice

/** 
* Check if Internet Connection is ONLINE 
*/ 
bool InterfaceJNI::isInternetConnected() 
{ 
    JavaVM* jvm = JniHelper::getJavaVM(); 
    int status; 
    JNIEnv *env; 
    jmethodID mid; 

    bool isAttached = false; 
    // jboolean o bool? 
    bool returnValue = false; 

    CCLog("Static isInternetConnected"); 

    // Get Status 
    status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6); 

    if(status < 0) 
    { 
     //LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread"); 
     status = jvm->AttachCurrentThread(&env, NULL); 
     CCLog("isInternetConnected Status 2: %d", status); 
     if(status < 0) 
     { 
      // LOGE("callback_handler: failed to attach " // "current thread"); 
      return false; 
     } 
     isAttached = true; 
     CCLog("isInternetConnected Status isAttached: %d", isAttached); 
    } 


    CCLog("isInternetConnected Status: %d", status); 

    jclass mClass = env->FindClass("org/example/SocialNetwork/InternetConnection"); 

    // Get Static bool isInternetConnection() 
    mid = env->GetStaticMethodID(mClass, "isInternetConnection", "()Z"); 
    if (mid == 0) 
    { 
     CCLog("isInternetConnected FAIL GET METHOD STATIC"); 
     return false; 
    } 
    // Call Static bool isInternetConnection() 
    returnValue = env->CallStaticBooleanMethod(mClass, mid); 
    CCLog("isInternetConnected Done "); 

      //----------------------------------------------------------- 
    CCLog("Finish"); 
    if(isAttached) 
     jvm->DetachCurrentThread(); 

    // Change for return value 
    return returnValue; 
} 

E il mio codice Java:

public class InternetConnection 
{ 
    /** 
    * Check if is working your hello world from C++ 
    */ 
    public static void helloWorld() 
    { 
     Log.v("InternetConnection", "HELLO WORLD"); 
    } 
    /** 
    * Check Internet Connection 
    * @return true is Online 
    */ 
    public static Boolean isInternetConnection() 
    { 
     Log.v("InternetConnection", "isInternetConnection Start"); 

     Context ctx = CCSocialNetwork.getAppContext(); 
     ConnectivityManager conMgr = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo i = conMgr.getActiveNetworkInfo(); 

     if (i == null) 
     { 
      Log.v("InternetConnection", "isInternetConnection NULL :S"); 
      return false; 
     } 

     if (!i.isConnected()) 
     { 
      Log.v("InternetConnection", "isInternetConnection is not connected"); 
      return false; 
     } 

     if (!i.isAvailable()) 
     { 
      Log.v("InternetConnection", "isInternetConnection is not available"); 
      return false; 
     } 
     Log.v("InternetConnection", "isInternetConnection DONE!"); 
     return true; 
    } 
} 

ma ottengo:

Fatal signal 7 (SIGBUS) at 0x00000000 (code=128) 

E devo Se posso ottenere correttamente un valore di ritorno , Non sarei nemmeno in grado di inviare parametri.

+1

Stai restituendo un booleano che in realtà è un oggetto. Prova a restituire invece un tipo primitivo booleano. – maba

+0

Ho provato ad aggiungere un vault booleano in Java ma non è quello – vgonisanz

+0

La riga che fallisce è "mid = env-> GetStaticMethodID (mClass," isInternetConnection ","() Z ");" se commento questo, e il seguente se, il segnale non appare – vgonisanz

risposta

3

Si sta restituendo un booleano che in realtà è un oggetto. Prova a restituire invece un tipo primitivo booleano.

0

Sei sicuro che il FindClass non abbia restituito NULL? Non lo stai verificando