zoukankan      html  css  js  c++  java
  • undefined reference to `android::Mutex::lock()'

    转自http://blog.csdn.net/keensword007/article/details/5720636

    用NDK编译时出现这么个错误undefined reference to `android::Mutex::lock()'

    起初以为没有链接必要的so,结果加上了  -lutils 也不行。所以google 了一下,发现有人遇到过此问题,如下:

    察看了一下ndk中的STABLE-APIS.TXT文档,上面有这样一句:

    Note that the Android C library includes support for pthread (<pthread.h>),

    so "LOCAL_LIBS := -lpthread" is not needed. The same is true for real-time

    extensions (-lrt on typical Linux distributions).

    也就是说使用多线程,并不需要增加-lpthread编译选项,看来解决问题还需要从源代码入手。察看frameworks/base/include/utils/threads.h文件,关于Mutex有如下代码片断:

    #if defined(HAVE_PTHREADS)

    inline Mutex::Mutex() {

        pthread_mutex_init(&mMutex, NULL);

    }

    inline Mutex::Mutex(const char* name) {

        pthread_mutex_init(&mMutex, NULL);

    }

    inline Mutex::Mutex(int type, const char* name) {

        if (type == SHARED) {

            pthread_mutexattr_t attr;

            pthread_mutexattr_init(&attr);

            pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);

            pthread_mutex_init(&mMutex, &attr);

            pthread_mutexattr_destroy(&attr);

        } else {

            pthread_mutex_init(&mMutex, NULL);

        }

    }

    inline Mutex::~Mutex() {

        pthread_mutex_destroy(&mMutex);

    }

    inline status_t Mutex::lock() {

        return -pthread_mutex_lock(&mMutex);

    }

    inline void Mutex::unlock() {

        pthread_mutex_unlock(&mMutex);

    }

    inline status_t Mutex::tryLock() {

        return -pthread_mutex_trylock(&mMutex);

    }

    #endif // HAVE_PTHREADS

    也就是说如果定义了HAVE_PTHREADS宏,就有Mutex的相关方法实现,如果没有定义这个宏,Mutex的方法又是如何实现的,下面看看frameworks/base/libs/utils/Threads.cpp中的代码:
    #if defined(HAVE_PTHREADS)
    // implemented as inlines in threads.h
    #elif defined(HAVE_WIN32_THREADS)
    Mutex::Mutex()
    {
        HANDLE hMutex;
        assert(sizeof(hMutex) == sizeof(mState));
        hMutex = CreateMutex(NULL, FALSE, NULL);
        mState = (void*) hMutex;
    }
    Mutex::Mutex(const char* name)
    {
        // XXX: name not used for now
        HANDLE hMutex;
        assert(sizeof(hMutex) == sizeof(mState));
        hMutex = CreateMutex(NULL, FALSE, NULL);
        mState = (void*) hMutex;
    }
    Mutex::Mutex(int type, const char* name)
    {
        // XXX: type and name not used for now
        HANDLE hMutex;
        assert(sizeof(hMutex) == sizeof(mState));
        hMutex = CreateMutex(NULL, FALSE, NULL);
        mState = (void*) hMutex;
    }
    Mutex::~Mutex()
    {
        CloseHandle((HANDLE) mState);
    }
    status_t Mutex::lock()
    {
        DWORD dwWaitResult;
        dwWaitResult = WaitForSingleObject((HANDLE) mState, INFINITE);
        return dwWaitResult != WAIT_OBJECT_0 ? -1 : NO_ERROR;
    }
    void Mutex::unlock()
    {
        if (!ReleaseMutex((HANDLE) mState))
            LOG(LOG_WARN, "thread", "WARNING: bad result from unlocking mutex/n");
    }
    status_t Mutex::tryLock()
    {
        DWORD dwWaitResult;
        dwWaitResult = WaitForSingleObject((HANDLE) mState, 0);
        if (dwWaitResult != WAIT_OBJECT_0 && dwWaitResult != WAIT_TIMEOUT)
            LOG(LOG_WARN, "thread", "WARNING: bad result from try-locking mutex/n");
        return (dwWaitResult == WAIT_OBJECT_0) ? 0 : -1;
    }
    #else
    #error "Somebody forgot to implement threads for this platform."
    #endif
    也就是说,要么定义HAVE_PTHREADS宏,要么定义HAVE_WIN32_THREADS宏,否则,Mutex类的方法就没有实现代码。对于andorid来说,需要定义HAVE_PTHREADS宏。从上面的代码中还可以看出,android的线程实现实际上还是使用了pthread库,只是在上面进行了一个封装。在Android.mk中增加下面一条语句,问题解决:
    LOCAL_CXXFLAGS := -DHAVE_PTHREADS
     
  • 相关阅读:
    如何在Unity中播放影片
    C# typeof()实例详解
    unity3d用鼠标拖动物体的一段代码
    unity3d中Find的用法
    geometry_msgs/PoseStamped 类型的变量的构造
    c++ ros 计算两点距离
    C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值
    C++ 结构体指针的定义
    Cannot initialize a variable of type 'Stu *' with an rvalue of type 'void *'
    C++中的平方、开方、绝对值怎么计算
  • 原文地址:https://www.cnblogs.com/soniclq/p/2577213.html
Copyright © 2011-2022 走看看