从Android中的C文件调用C ++函数

时间:2017-08-04 21:17:55

标签: android c++ c android-ndk java-native-interface

我正在使用C / C ++在Android上进行开发。我有一个C ++函数,需要从C文件中调用。这就是我现在正在做的事情,但我得到了错误

  

__check_expiry

的未定义引用

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();
}

1 个答案:

答案 0 :(得分:2)

不导出静态函数。删除static限定符。

(不相关:只要您来自a.cpp #include "a.h",您就不需要源文件中的extern "C"。)