Tomcat爲每個應用程序使用不同的類加載器,因此它可以使它們隔離。也就是說,如果您有一個提供Consumer類(作爲Person)的Web應用程序和提供相同類名Consumer(作爲線程)的其他Web應用程序,那麼它可能會導致這兩個應用程序發生衝突和問題(消費者應該使用Tomcat加載?)。要回答這個tomcat,爲每個應用程序創建一個ClassLoader,並使用它們自己的獨立jar和類。如下圖所示,這是Tomcat ClassLoaders的層次結構。問題在於你的JNI調用正在獲取System ClassLoader(Default),它沒有你想要調用的類的信息。
Bootstrap
|
System
|
Common
/ \
Catalina Shared
/ \
Webapp1 Webapp2 ...
要解決此問題,您需要找到您的應用程序類加載器。您可以通過在您的應用程序中定義的某些類中調用getClass().getClassLoader()
來輕鬆完成此操作。這將獲得加載該類的ClassLoader,我們知道這是您的Web Application ClassLoader。之後,您撥打loadClass("foo.bar.ClassThatIWant"
)方法並獲得所需的課程。在Java中一切都應該是這樣的:
ClassLoader cl = AWebClass.class.getClassLoader();
Class myClass = cl.loadClass("foo.bar.ClassThatIWant");
不要做JNI的伎倆你就以下,假設你通過你的Web應用程序的類加載器名爲webCL
參數。
jclass classLoaderClass = env->GetObjectClass(webCL);
jmethodID loadClassMethod = env->GetMethodID(classLoaderClass, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
const char *className = "foo.bar.ClassThatIWant"; // This needs dots because it's the arg for Java
jstring javaClassName = env->NewStringUTF(desiredClass);
jclass desiredClass = env->CallObjectMethod(webCL, loadClassMethod, javaClassName);
請複製代碼和例外。 – 2010-11-25 07:55:07