JNIEXPORT jint JNICALL JNI_OnLoad()

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;
}