mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-21 01:40:04 +08:00
ee3ef86255
From-SVN: r46459
77 lines
1.7 KiB
C++
77 lines
1.7 KiB
C++
// natSharedLibLoader.cc - Implementation of FirstThread native methods.
|
|
|
|
/* Copyright (C) 2001 Free Software Foundation
|
|
|
|
This file is part of libgcj.
|
|
|
|
This software is copyrighted work licensed under the terms of the
|
|
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
|
details. */
|
|
|
|
#include <config.h>
|
|
|
|
#include <gcj/cni.h>
|
|
#include <gnu/gcj/runtime/SharedLibLoader.h>
|
|
#include <java/io/IOException.h>
|
|
#include <java/lang/UnsupportedOperationException.h>
|
|
|
|
#ifdef HAVE_DLOPEN
|
|
#include <dlfcn.h>
|
|
|
|
/* Only used during dlopen, while having a lock on Class.class. */
|
|
static gnu::gcj::runtime::SharedLibLoader* curLoader;
|
|
|
|
typedef void (*ClassHookFunc) (jclass);
|
|
|
|
static void
|
|
::register_hook(jclass cls)
|
|
{
|
|
curLoader->registerClass(cls->getName(), cls);
|
|
}
|
|
|
|
struct SharedLibDummy
|
|
{
|
|
ClassHookFunc saved;
|
|
SharedLibDummy()
|
|
{
|
|
saved = _Jv_RegisterClassHook;
|
|
}
|
|
~SharedLibDummy()
|
|
{
|
|
_Jv_RegisterClassHook = saved;
|
|
curLoader = NULL;
|
|
}
|
|
};
|
|
#endif
|
|
|
|
void
|
|
gnu::gcj::runtime::SharedLibLoader::init(jbyteArray libname, jint flags)
|
|
{
|
|
#ifdef HAVE_DLOPEN
|
|
char *lname = (char*) elements(libname);
|
|
if (flags==0)
|
|
flags = RTLD_LAZY;
|
|
JvSynchronize dummy1(&java::lang::Class::class$);
|
|
SharedLibDummy dummy2;
|
|
curLoader = this;
|
|
_Jv_RegisterClassHook = ::register_hook;
|
|
void *h = dlopen(lname, flags);
|
|
if (h == NULL)
|
|
{
|
|
const char *msg = dlerror();
|
|
}
|
|
handler = (gnu::gcj::RawData*) h;
|
|
#else
|
|
const char *msg = "ShareedLibLoader is not supported on this platform";
|
|
throw new java::lang::UnsupportedOperationException(JvNewStringLatin1(msg));
|
|
#endif
|
|
}
|
|
|
|
void
|
|
gnu::gcj::runtime::SharedLibLoader::finalize()
|
|
{
|
|
#ifdef HAVE_DLOPEN
|
|
dlclose (handler);
|
|
#endif
|
|
}
|