Merge "Switch get_env_or_die to requireEnv" into rvc-dev am: b1dfb8e575 am: 44bc63016b

Change-Id: I9f085ba7d8f23b6e8e7990ee929ab802e53d6c2d
This commit is contained in:
Leon Scroggins
2020-04-07 13:55:08 +00:00
committed by Automerger Merge Worker
5 changed files with 24 additions and 22 deletions

View File

@@ -183,7 +183,7 @@ public:
} }
~InvokeListener() override { ~InvokeListener() override {
auto* env = get_env_or_die(mJvm); auto* env = requireEnv(mJvm);
env->DeleteWeakGlobalRef(mWeakRef); env->DeleteWeakGlobalRef(mWeakRef);
} }

View File

@@ -9,24 +9,6 @@ using namespace android;
static jmethodID gByteBuffer_getMethodID; static jmethodID gByteBuffer_getMethodID;
static jmethodID gByteBuffer_setPositionMethodID; static jmethodID gByteBuffer_setPositionMethodID;
/**
* Helper method for accessing the JNI interface pointer.
*
* Image decoding (which this supports) is started on a thread that is already
* attached to the Java VM. But an AnimatedImageDrawable continues decoding on
* the AnimatedImageThread, which is not attached. This will attach if
* necessary.
*/
static JNIEnv* requireEnv(JavaVM* jvm) {
JNIEnv* env;
if (jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
if (jvm->AttachCurrentThreadAsDaemon(&env, nullptr) != JNI_OK) {
LOG_ALWAYS_FATAL("Failed to AttachCurrentThread!");
}
}
return env;
}
class ByteBufferStream : public SkStreamAsset { class ByteBufferStream : public SkStreamAsset {
private: private:
ByteBufferStream(JavaVM* jvm, jobject jbyteBuffer, size_t initialPosition, size_t length, ByteBufferStream(JavaVM* jvm, jobject jbyteBuffer, size_t initialPosition, size_t length,
@@ -304,7 +286,7 @@ std::unique_ptr<SkStream> CreateByteBufferStreamAdaptor(JNIEnv* env, jobject jby
auto* context = new release_proc_context{jvm, jbyteBuffer}; auto* context = new release_proc_context{jvm, jbyteBuffer};
auto releaseProc = [](const void*, void* context) { auto releaseProc = [](const void*, void* context) {
auto* c = reinterpret_cast<release_proc_context*>(context); auto* c = reinterpret_cast<release_proc_context*>(context);
JNIEnv* env = get_env_or_die(c->jvm); JNIEnv* env = requireEnv(c->jvm);
env->DeleteGlobalRef(c->jbyteBuffer); env->DeleteGlobalRef(c->jbyteBuffer);
delete c; delete c;
}; };

View File

@@ -49,13 +49,13 @@ public:
} }
~JavaInputStreamAdaptor() override { ~JavaInputStreamAdaptor() override {
auto* env = android::get_env_or_die(fJvm); auto* env = android::requireEnv(fJvm);
env->DeleteGlobalRef(fJavaInputStream); env->DeleteGlobalRef(fJavaInputStream);
env->DeleteGlobalRef(fJavaByteArray); env->DeleteGlobalRef(fJavaByteArray);
} }
size_t read(void* buffer, size_t size) override { size_t read(void* buffer, size_t size) override {
auto* env = android::get_env_or_die(fJvm); auto* env = android::requireEnv(fJvm);
if (!fSwallowExceptions && checkException(env)) { if (!fSwallowExceptions && checkException(env)) {
// Just in case the caller did not clear from a previous exception. // Just in case the caller did not clear from a previous exception.
return 0; return 0;

View File

@@ -159,3 +159,13 @@ JNIEnv* android::get_env_or_die(JavaVM* jvm) {
} }
return env; return env;
} }
JNIEnv* android::requireEnv(JavaVM* jvm) {
JNIEnv* env;
if (jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
if (jvm->AttachCurrentThreadAsDaemon(&env, nullptr) != JNI_OK) {
LOG_ALWAYS_FATAL("Failed to AttachCurrentThread!");
}
}
return env;
}

View File

@@ -78,6 +78,16 @@ bool isSeekable(int descriptor);
JNIEnv* get_env_or_die(JavaVM* jvm); JNIEnv* get_env_or_die(JavaVM* jvm);
/**
* Helper method for accessing the JNI interface pointer.
*
* Image decoding (which this supports) is started on a thread that is already
* attached to the Java VM. But an AnimatedImageDrawable continues decoding on
* the AnimatedImageThread, which is not attached. This will attach if
* necessary.
*/
JNIEnv* requireEnv(JavaVM* jvm);
}; // namespace android }; // namespace android
#endif // _ANDROID_GRAPHICS_UTILS_H_ #endif // _ANDROID_GRAPHICS_UTILS_H_