📄 natsharedlibloader.cc
字号:
// natSharedLibLoader.cc - Implementation of SharedLibHelper native methods./* Copyright (C) 2001, 2003 Free Software Foundation This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License. Please consult the file "LIBGCJ_LICENSE" fordetails. */#include <config.h>#include <gcj/cni.h>#include <jvm.h>#include <gnu/gcj/runtime/SharedLibHelper.h>#include <java/io/IOException.h>#include <java/lang/UnsupportedOperationException.h>#include <java/lang/UnknownError.h>#ifdef HAVE_DLOPEN#include <dlfcn.h>/* Only used during dlopen, while having a lock on Class.class. */static java::lang::ClassLoader *curLoader;static gnu::gcj::runtime::SharedLibHelper *curHelper;typedef void (*ClassHookFunc) (jclass);typedef void (*CoreHookFunc) (_Jv_core_chain *);void_Jv_sharedlib_register_hook (jclass cls){ curHelper->registerClass(cls->getName(), cls); cls->protectionDomain = curHelper->domain; cls->loader = curLoader;}static voidcore_hook (_Jv_core_chain *chain){ chain->next = (_Jv_core_chain *) curHelper->core_chain; curHelper->core_chain = (gnu::gcj::RawData *) chain;}struct SharedLibDummy{ ClassHookFunc saved; CoreHookFunc saved_core; SharedLibDummy() { saved = _Jv_RegisterClassHook; saved_core = _Jv_RegisterCoreHook; } ~SharedLibDummy() { _Jv_RegisterClassHook = saved; _Jv_RegisterCoreHook = saved_core; curLoader = NULL; }};#endifvoidgnu::gcj::runtime::SharedLibHelper::init(void){#ifdef HAVE_DLOPEN char *lname = (char *) __builtin_alloca (JvGetStringUTFLength (baseName) + 1); jsize total = JvGetStringUTFRegion (baseName, 0, baseName->length(), lname); lname[total] = '\0'; if (flags==0) flags = RTLD_GLOBAL | RTLD_LAZY; JvSynchronize dummy1(&java::lang::Class::class$); SharedLibDummy dummy2; curLoader = loader; curHelper = this; _Jv_RegisterClassHook = _Jv_sharedlib_register_hook; _Jv_RegisterCoreHook = core_hook; void *h = dlopen(lname, flags); if (h == NULL) { const char *msg = dlerror(); throw new java::lang::UnknownError(JvNewStringLatin1(msg)); } handler = (gnu::gcj::RawData*) h;#else const char *msg = "shared library class loading is not supported on this platform"; throw new java::lang::UnsupportedOperationException(JvNewStringLatin1(msg));#endif}jbooleangnu::gcj::runtime::SharedLibHelper::hasResource (jstring name){#ifdef HAVE_DLOPEN _Jv_core_chain *node = _Jv_FindCore ((_Jv_core_chain *) core_chain, name); return node != NULL;#else return false;#endif}gnu::gcj::Core *gnu::gcj::runtime::SharedLibHelper::findCore (jstring name){#ifdef HAVE_DLOPEN extern gnu::gcj::Core *_Jv_create_core (_Jv_core_chain *node, jstring name); ensureInit(); return _Jv_create_core ((_Jv_core_chain *) core_chain, name);#else return NULL;#endif}voidgnu::gcj::runtime::SharedLibHelper::finalize(){ _Jv_FreeCoreChain ((_Jv_core_chain *) core_chain);#ifdef HAVE_DLOPEN dlclose (handler);#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -