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();
}
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
en supprimant les traits de soulignement n'aide pas non plus. Obtenir la même erreur. – user2284140
supprime le 'static' sur' static int __check_expiry() 'le qualificateur interne est prioritaire donc le nom n'est pas exporté. –