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