2017-08-04 1 views
0

Je fais du développement sous Android en utilisant C/C++. J'ai une fonction C++, qui doit être appelée à partir d'un fichier C. Voici ce que je fais en ce moment, mais je reçois l'erreurAppel de la fonction C++ à partir d'un fichier C sous Android

de référence non définie à « __check_expiry »

La fonction C++ est définie dans « a.h » et mis en œuvre « a.cpp ». J'inclus "a.h" dans le fichier "b.c" et appelle la méthode "__check_expiry" du fichier "b.c".

a.h:

#ifdef __cplusplus 
extern "C" { 
#endif 

static int __check_expiry(void); 

#ifdef __cplusplus 
} 
#endif 

a.cpp:

extern "C" { 

static int __check_expiry() { 

    vz::lock_guard<std::mutex> guard(mutex_check, lock_hooker_check); 

    JNIEnv *env = NULL; 
    static bool __is_attached_1 = false; 

    if ((env = __getEnv(&__is_attached_1)) == NULL) { 
     //log_info("getEnv fail\r\n"); 
    } 
    assert(!__is_attached_1); 

    int obj = env->CallStaticIntMethod((jclass) g_class, g_methodID); 
    log_info("Returned value from JAVA %d", obj); 

    __releaseEnv(__is_attached_1); 

    guard.~lock_guard(); 

    return obj; 
} 

} 

b.c:

#ifdef __cplusplus 
extern "C" { 
#endif 

#include "a.h" 

#ifdef __cplusplus 
} 
#endif 

static int tunnel_to() 
{ 
    int value = __check_expiry(); 
} 
+0

Une chose à noter est que vous n'êtes pas autorisé à utiliser des noms commençant par un double trait de soulignement, ou un trait de soulignement suivi d'un majuscule (pourrait être restreint aux noms globaux, mais je les éviterais complètement) – Justin

+0

en supprimant les traits de soulignement n'aide pas non plus. Obtenir la même erreur. – user2284140

+3

supprime le 'static' sur' static int __check_expiry() 'le qualificateur interne est prioritaire donc le nom n'est pas exporté. –

Répondre

2

fonctions statiques ne sont pas exportés. Supprimez le qualificatif static.

(non apparentés: aussi longtemps que vous #include "a.h" de a.cpp, vous n'avez pas besoin extern "C" dans votre fichier source.)