<false>是什么意思?在“类ScopedBytesRW:public Sc​​opedBytes <false>”中

时间:2018-02-01 11:28:22

标签: c++ class java-native-interface

以下代码中<false><true>的含义是什么?

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

我不知道在“ScopedBytesRO:public Sc​​opedBytes”中,<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

1 个答案:

答案 0 :(得分:1)

ScopedBytes是一个带有2种状态的模板化类:readonly(true)或not-readony(false)。

当对象被破坏时,如果它是只读的,它会设置标志JNI_ABORT,因此内存不会被释放。如果没有,则标志为0(无值)并释放内存。

template<bool readOnly>
class ScopedBytes
{
    ...

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