是什么<false>意思?在"class ScopedBytesRW : public ScopedBytes<false>"

What does <false> mean? in “class ScopedBytesRW : public ScopedBytes<false>”

本文关键字:gt false lt public ScopedBytes ScopedBytesRW 意思 是什么 class      更新时间:2023-10-16
以下

代码中的<false><true>是什么意思?

我分析了 Android 系统文件读写的 JNI 实现,找到了以下C++代码。

我不知道在"class ScopedBytesRO: public ScopedBytes"中,<true>的含义是什么

谁能帮助我?

谢谢!

android-6.0.1-2.1.0\libnativehelper\includeativehelper\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

ScopedBytes 是一个模板化类,具有 2 种状态:只读 ( true ( 或非读取 ( false (。

当对象被销毁时,如果它是只读的,它会设置标志JNI_ABORT这样内存就不会被释放。否则,标志0(无值(并释放内存。

template<bool readOnly>
class ScopedBytes
{
    ...
    ~ScopedBytes() {
        mEnv->ReleaseByteArrayElements(... , readOnly ? JNI_ABORT : 0);
    }
}