0
C/C++を使用してAndroidで開発しています。私はCファイルから呼び出される必要があるC++関数を持っています。ここで私が今やっているものですが、私は「__check_expiry」AndroidのCファイルからC++関数を呼び出す
C++関数が「a.h」で定義されており、「a.cpp」で実装されているとエラー
未定義の参照を取得します。私は "b.c"ファイルに "a.h"を含め、 "b.c"ファイルから "__check_expiry"メソッドを呼び出しています。
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(); }
ことの一つは、あなたがで始まる名前を使用することを許可されていないということですダブルアンダースコア、またはアンダースコアの後ろに大文字(グローバル名に制限されているかもしれませんが、私はそれらを完全に避けるかもしれません) – Justin
アンダースコアを削除することは役に立ちません。同じエラーが発生しました。 – user2284140
静的int __check_expiry()で 'static 'を削除すると、内部修飾子が優先され、名前はエクスポートされません。 –