1 // Native code for VMClassLoader
3 /* Copyright (C) 2002, 2003, 2005 Free Software Foundation
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
16 #include <gnu/gcj/runtime/VMClassLoader.h>
17 #include <java/lang/Class.h>
18 #include <java/lang/StringBuffer.h>
19 #include <java/net/URLClassLoader.h>
20 #include <java/lang/Runtime.h>
21 #include <java/util/HashSet.h>
24 gnu::gcj::runtime::VMClassLoader::findClass (jstring name
)
26 _Jv_Utf8Const
*name_u
= _Jv_makeUtf8Const (name
);
27 jclass klass
= _Jv_FindClassInCache (name_u
);
29 if (! klass
&& lib_control
!= LIB_NEVER
)
31 // Turn `gnu.pkg.quux' into `lib-gnu-pkg-quux'. Then search for
32 // a module named (eg, on Linux) `lib-gnu-pkg-quux.so', followed
33 // by `lib-gnu-pkg.so' and `lib-gnu.so'. If loading one of
34 // these causes the class to appear in the cache, then use it.
35 java::lang::StringBuffer
*sb
= new java::lang::StringBuffer (JvNewStringLatin1("lib-"));
38 jint ci
= name
->indexOf('$');
42 cn
= name
->substring (0, ci
);
43 jstring so_base_name
= (sb
->append (cn
)->toString ())->replace ('.', '-');
45 using namespace ::java::lang
;
46 Runtime
*rt
= Runtime::getRuntime();
48 // Compare against `3' because that is the length of "lib".
49 while (! klass
&& so_base_name
&& so_base_name
->length() > 3)
51 if (lib_control
== LIB_CACHE
)
53 // If we've already tried this name, we're done.
54 if (tried_libraries
->contains(so_base_name
))
56 tried_libraries
->add(so_base_name
);
59 jboolean loaded
= rt
->loadLibraryInternal (so_base_name
);
61 jint nd
= so_base_name
->lastIndexOf ('-');
65 so_base_name
= so_base_name
->substring (0, nd
);
68 klass
= _Jv_FindClassInCache (name_u
);
72 // Either define the package, or try loading using the interpreter.
74 definePackageForNative(name
);
76 klass
= java::net::URLClassLoader::findClass (name
);