2017-08-04 19 views
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(); 
} 
+0

ことの一つは、あなたがで始まる名前を使用することを許可されていないということですダブルアンダースコア、またはアンダースコアの後ろに大文字(グローバル名に制限されているかもしれませんが、私はそれらを完全に避けるかもしれません) – Justin

+0

アンダースコアを削除することは役に立ちません。同じエラーが発生しました。 – user2284140

+3

静的int __check_expiry()で 'static 'を削除すると、内部修飾子が優先され、名前はエクスポートされません。 –

答えて

2

静的関数がエクスポートされません。 static修飾子を削除します。

(無関係:限りa.cppからあなた#include "a.h"として、あなたは、ソースファイル内extern "C"を必要としません。)注意すべき

関連する問題