HMODULE open_library()

in src/main/native/org/apache/commons/crypto/DynamicLoader.c [26:92]


HMODULE open_library(JNIEnv *env)

{
  if (!openssl) {
    const char *libraryPath = COMMONS_CRYPTO_OPENSSL_LIBRARY;
    jclass clazz = (*env)->FindClass(env, "org/apache/commons/crypto/utils/Utils");
    if (clazz) {
        jmethodID libraryPathFunc = (*env)->GetStaticMethodID(env, clazz, "libraryPath", "(Ljava/lang/String;)Ljava/lang/String;");
        if (libraryPathFunc) {
            jstring defaultLibrary = (*env)->NewStringUTF(env, COMMONS_CRYPTO_OPENSSL_LIBRARY);
            jstring result = (jstring) (*env)->CallStaticObjectMethod(env, clazz, libraryPathFunc, defaultLibrary);
            if (result) {
                libraryPath = (*env)->GetStringUTFChars(env, result, NULL);
            }
        }
    }
#ifdef MAC_OS
    #include <string.h>
    if (0 == strncmp(COMMONS_CRYPTO_OPENSSL_LIBRARY,libraryPath, sizeof(COMMONS_CRYPTO_OPENSSL_LIBRARY))) {
        bool ret = dlopen_preflight(libraryPath);
        if (!ret) {
            char msg[1000];
            snprintf(msg, sizeof(msg), "Cannot load default library '%s'; please define jni.library.path! (%s)", libraryPath, dlerror());
            THROW(env, "java/lang/UnsatisfiedLinkError", msg);
            return 0;
        }
    }
#endif
#ifdef UNIX
    openssl = dlopen(libraryPath, RTLD_LAZY | RTLD_GLOBAL);
#endif

#ifdef WINDOWS
    openssl = LoadLibraryA(libraryPath); // use the non-generic method; assume libraryPath is suitable
#endif

    //   Did we succeed?
    if (!openssl)
    {
        char msg[1000];
#ifdef UNIX
        snprintf(msg, sizeof(msg), "Cannot load '%s' (%s)!", libraryPath, dlerror()); // returns char*
#endif
#ifdef WINDOWS
        // Crude method to convert most likely errors to string
        DWORD lastError = GetLastError();
        char *lastmsg;
        if (lastError == 126)
        {
            lastmsg = "specified module cannot be found";
        }
        else if (lastError == 193)
        {
            lastmsg = "module is not a valid Win32 application";
        }
        else
        {
            lastmsg = "unknown error - check online Windows documentation";
        }
        snprintf(msg, sizeof(msg), "Cannot load '%s' (%d: %s)!", libraryPath, lastError, lastmsg);
#endif
        THROW(env, "java/lang/UnsatisfiedLinkError", msg);
        return 0;
    }
  }
  return openssl;
}