以下代码中<false>
和<true>
的含义是什么?
我分析了Android系统文件读写的JNI实现,并找到了以下C ++代码。
我不知道在“ScopedBytesRO:public ScopedBytes”中,<true>
谁能帮帮我?
谢谢!
机器人-6.0.1-2.1.0 \ libnativehelper \包括\ nativehelper \ ScopedBytes.h
#ifndef SCOPED_BYTES_H_included
#define SCOPED_BYTES_H_included
#include "JNIHelp.h"
template<bool readOnly>
class ScopedBytes {
public:
ScopedBytes(JNIEnv* env, jobject object)
: mEnv(env), mObject(object), mByteArray(NULL), mPtr(NULL)
{
if (mObject == NULL) {
jniThrowNullPointerException(mEnv, NULL);
} else if (mEnv->IsInstanceOf(mObject, JniConstants::byteArrayClass)) {
mByteArray = reinterpret_cast<jbyteArray>(mObject);
mPtr = mEnv->GetByteArrayElements(mByteArray, NULL);
} else {
mPtr = reinterpret_cast<jbyte*>(mEnv->GetDirectBufferAddress(mObject));
}
}
~ScopedBytes() {
if (mByteArray != NULL) {
mEnv->ReleaseByteArrayElements(mByteArray, mPtr, readOnly ? JNI_ABORT : 0);
}
}
private:
JNIEnv* mEnv;
jobject mObject;
jbyteArray mByteArray;
protected:
jbyte* mPtr;
private:
// Disallow copy and assignment.
ScopedBytes(const ScopedBytes&);
void operator=(const ScopedBytes&);
};
class ScopedBytesRO : public **ScopedBytes<true>** {
public:
ScopedBytesRO(JNIEnv* env, jobject object) : **ScopedBytes<true>**(env, object) {}
const jbyte* get() const {
return mPtr;
}
};
class ScopedBytesRW : public ScopedBytes<false> {
public:
ScopedBytesRW(JNIEnv* env, jobject object) : **ScopedBytes<false>**(env, object) {}
jbyte* get() {
return mPtr;
}
};
#endif // SCOPED_BYTES_H_included
答案 0 :(得分:1)
ScopedBytes是一个带有2种状态的模板化类:readonly(true
)或not-readony(false
)。
当对象被破坏时,如果它是只读的,它会设置标志JNI_ABORT
,因此内存不会被释放。如果没有,则标志为0
(无值)并释放内存。
template<bool readOnly>
class ScopedBytes
{
...
~ScopedBytes() {
mEnv->ReleaseByteArrayElements(... , readOnly ? JNI_ABORT : 0);
}
}