Android2.2:'pthread_rwlock_t' does not name a type: android 2.3版本以下不支持读写锁的解决办法
来源:互联网 发布:对越自卫反击战知乎 编辑:程序博客网 时间:2024/05/16 07:00
好了,我前面的一篇blog已经讲过了这个问题。
http://blog.csdn.net/whitetao/article/details/7242712
在Android API < 9时,采用android NDK编译代码是不支持pthread_rwlock_t结构体的。
当时给的解决办法是改写application.mk文件,把版本改成9,APP_PLATFORM := android-9 //对应2.3.1
但是如果我们就需要android 2.2及一下版本支持这个结构体怎么办?
下面将给出解决办法
大家第一点肯定会想,既然不支持,那么我们能否使用android 2.3.1的跟该结构体相关的东东替换掉android2.2版本的呢?
然后我就去查了相关的东东,发现该结构体定义在pthread.h中,代码实现打包在libc.so中,然后进行替换
我试过了,确实是个好办法,编译通过了,但是,我们编译出来的库java层通过jni调用不了了,百思不得其解。
我想了一下,因为libc.so是一些基础库,可能native的一些规则里面也有,两个版本的规则不一致了,所以找不到了。
反正不管它吧,这个方法以失败告终。
好了,再打开android 2.3.1的pthread.h头文件看一下,
就是多定义了一个结构体:
typedef struct {
pthread_mutex_t lock;
pthread_cond_t cond;
int numLocks;
int writerThreadId;
int pendingReaders;
int pendingWriters;
void* reserved[4]; /* for future extensibility */
} pthread_rwlock_t;
还有一些函数:
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock, const struct timespec *abs_timeout);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock, const struct timespec *abs_timeout);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
其实也就是做读写锁用的,简单来说也就是个互斥的问题。
回头看一下我的代码。
本人看的是webrtc,google的一个开源项目,里面呢封装了一下这个读写锁,定义成自己的工具库使用。
好了,既然知道是什么东东了,那就自己写一个好了:
先看一下webrtc的代码吧:
#include "rw_lock_wrapper.h"
#include <pthread.h>
namespace webrtc {
class RWLockPosix : public RWLockWrapper
{
public:
RWLockPosix();
virtual ~RWLockPosix();
virtual void AcquireLockExclusive();//写锁
virtual void ReleaseLockExclusive();
virtual void AcquireLockShared();//读锁
virtual void ReleaseLockShared();
protected:
virtual int Init();
private:
//pthread_rwlock_t _lock;
};
} // namespace webrtc
好了,既然知道要实现什么功能,自己写一个呗,搞个信号量互斥一下就好了(效率肯定是不如2.3的了,没办法解决多个读,但是至少不会出错了,效率低就低点儿吧)
我随便给贴一个信号量的东西,加进去就好了
CVSemaphore::CVSemaphore(VLONG lCount /* = 1 */, VCHAR *pszName /* = 0 */)
{
sem_init(&m_sem, 0, lCount);
}
CVSemaphore::~CVSemaphore()
{
sem_destroy(&m_sem);
}
VBOOL CVSemaphore::Lock(VUINT32 dwTimeOut /* = -1 */)
{
if ((VUINT32)-1 == dwTimeOut)
{
if (sem_wait(&m_sem))
{
return VFALSE;
}
}
else
{
}
return VTRUE;
}
VBOOL CVSemaphore::Unlock()
{
if (sem_post(&m_sem))
{
return VFALSE;
}
return VTRUE;
}
- Android2.2:'pthread_rwlock_t' does not name a type: android 2.3版本以下不支持读写锁的解决办法
- ndk 编译webrtc出现 rw_lock_posix.h:35: error: 'pthread_rwlock_t' does not name a type
- `QtValidLicenseForCoreModule' does not name a type 错误的解决
- error :does not name a type
- c++ class does not name a type
- error: ‘ptrdiff_t’ does not name a type
- 'int32_t' does not name a type
- error: 'uid_t' does not name a type
- error: ‘ptrdiff_t’ does not name a type
- error: ‘ptrdiff_t’ does not name a type
- c++ class does not name a type
- ’string‘ does not name a type
- error: 'uint8_t' does not name a type
- c++ class does not name a type
- vector does not name a type
- error: 'vector' does not name a type
- class does not name a type
- ERROR:shared_ptr does not name a type
- 小东西总结(一)
- Git 中文教程
- Pinnacle 500-USB驱动下载
- 挂钩(HOOK)
- 【MARK】解决APT-GET下载报错的方法
- Android2.2:'pthread_rwlock_t' does not name a type: android 2.3版本以下不支持读写锁的解决办法
- about apache wink
- jQuery的domReady
- V$PGA_TARGET_ADVICE的用法 转
- QT4和ogre结合代码(英文)
- 10个iPhone开发资源库
- Android Root方法原理解析及Hook(三) FrameworkListener漏洞
- 【MARK】Installing the JDK5 and JDK6 for android4.0.3
- uboot 编译过程