in static-webp/src/main/jni/static-webp/webp_bitmapfactory.cpp [263:366]
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
// find java classes
jclass runtimeException = env->FindClass("java/lang/RuntimeException");
if (runtimeException == nullptr) {
LOGE("could not find RuntimeException class");
return -1;
}
jRuntimeException_class =
reinterpret_cast<jclass>(env->NewGlobalRef(runtimeException));
CREATE_AS_GLOBAL(runtimeExceptionClass, "java/lang/RuntimeException");
jclass isClass = env->FindClass("java/io/InputStream");
THROW_AND_RETURNVAL_IF(isClass == nullptr, "could not find InputStream", -1);
jclass osClass = env->FindClass("java/io/OutputStream");
THROW_AND_RETURNVAL_IF(osClass == nullptr, "could not find OutputStream", -1);
// find java methods
midInputStreamRead = env->GetMethodID(isClass, "read", "([B)I");
THROW_AND_RETURNVAL_IF(
midInputStreamRead == nullptr,
"failed to register InputStream.read",
-1);
midInputStreamSkip = env->GetMethodID(isClass, "skip", "(J)J");
THROW_AND_RETURNVAL_IF(
midInputStreamSkip == nullptr,
"failed to register InputStream.skip",
-1);
midOutputStreamWrite = env->GetMethodID(osClass, "write", "([B)V");
THROW_AND_RETURNVAL_IF(
midOutputStreamWrite == nullptr,
"failed to register OutputStream.write",
-1);
midOutputStreamWriteWithBounds = env->GetMethodID(osClass, "write", "([BII)V");
THROW_AND_RETURNVAL_IF(
midOutputStreamWriteWithBounds == nullptr,
"failed to register OutputStream.write",
-1);
bitmapOptionsClass = (jclass)env->NewGlobalRef(env->FindClass("android/graphics/BitmapFactory$Options"));
RETURN_IF_ERROR
webpBitmapFactoryClass = (jclass)env->NewGlobalRef(env->FindClass("com/facebook/webpsupport/WebpBitmapFactoryImpl"));
RETURN_IF_ERROR
CREATE_AS_GLOBAL(bitmapClass, "android/graphics/Bitmap");
CREATE_AS_GLOBAL(fileDescriptorClass, "java/io/FileDescriptor");
createBitmapFunction = env->GetStaticMethodID(webpBitmapFactoryClass, "createBitmap", "(IILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;");
RETURN_IF_ERROR
configName = env->NewStringUTF("ARGB_8888");
RETURN_IF_ERROR
configName = (jstring)env->NewGlobalRef(configName);
RETURN_IF_ERROR
CREATE_AS_GLOBAL(bitmapConfigClass, "android/graphics/Bitmap$Config");
valueOfBitmapConfigFunction = env->GetStaticMethodID(bitmapConfigClass, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;");
RETURN_IF_ERROR
UnionJNIEnvToVoid uenv;
uenv.venv = NULL;
if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
env = uenv.env;
if (registerNatives(env) != JNI_TRUE) {
return -1;
}
if (registerWebpTranscoderMethods(env) != JNI_TRUE) {
return -1;
}
// We do this only if a class in animated-webp is present in the classpath
jclass animatedWebpClass = env->FindClass("com/facebook/animated/webp/WebPImage");
if (animatedWebpClass) {
if (initWebPImage(env) != JNI_OK) {
return -1;
}
} else {
jboolean flag = env->ExceptionCheck();
if (flag) {
env->ExceptionClear();
}
}
return JNI_VERSION_1_6;
}