Bug 705386 - Allow AutoLocalJNIFrame callers to specify the JNIEnv. r=mwu

This commit is contained in:
Mounir Lamouri 2011-11-29 17:34:52 +01:00
Родитель 1e74e69eff
Коммит 7b9c2e04c6
1 изменённых файлов: 33 добавлений и 13 удалений

Просмотреть файл

@ -233,30 +233,50 @@ public:
bool GetAccessibilityEnabled();
struct AutoLocalJNIFrame {
AutoLocalJNIFrame(int nEntries = 128) : mEntries(nEntries) {
// Make sure there is enough space to store a local ref to the
// exception. I am not completely sure this is needed, but does
// not hurt.
AndroidBridge::Bridge()->JNI()->PushLocalFrame(mEntries + 1);
class AutoLocalJNIFrame {
public:
AutoLocalJNIFrame(int nEntries = 128)
: mEntries(nEntries)
, mJNIEnv(JNI())
{
Push();
}
AutoLocalJNIFrame(JNIEnv* aJNIEnv, int nEntries = 128)
: mEntries(nEntries)
, mJNIEnv(aJNIEnv ? aJNIEnv : JNI())
{
Push();
}
// Note! Calling Purge makes all previous local refs created in
// the AutoLocalJNIFrame's scope INVALID; be sure that you locked down
// any local refs that you need to keep around in global refs!
void Purge() {
AndroidBridge::Bridge()->JNI()->PopLocalFrame(NULL);
AndroidBridge::Bridge()->JNI()->PushLocalFrame(mEntries);
mJNIEnv->PopLocalFrame(NULL);
Push();
}
~AutoLocalJNIFrame() {
jthrowable exception =
AndroidBridge::Bridge()->JNI()->ExceptionOccurred();
jthrowable exception = mJNIEnv->ExceptionOccurred();
if (exception) {
AndroidBridge::Bridge()->JNI()->ExceptionDescribe();
AndroidBridge::Bridge()->JNI()->ExceptionClear();
mJNIEnv->ExceptionDescribe();
mJNIEnv->ExceptionClear();
}
AndroidBridge::Bridge()->JNI()->PopLocalFrame(NULL);
mJNIEnv->PopLocalFrame(NULL);
}
private:
void Push() {
// Make sure there is enough space to store a local ref to the
// exception. I am not completely sure this is needed, but does
// not hurt.
mJNIEnv->PushLocalFrame(mEntries + 1);
}
int mEntries;
JNIEnv* mJNIEnv;
};
/* See GLHelpers.java as to why this is needed */