[英]Problem in calling class from tomcat in JNI
我遇到了問題。 我正在從 VC++ 調用 Java 類。 當我從 ID 運行 Java 程序時,它工作正常,但是當我將它部署在 tomcat 上時,它給了我一個異常,當我開始調試它時,我發現它在cls
返回 null 。 如何在 FindClass 中給出絕對路徑,以便它也可以從 tomcat 中調用? 這個類也駐留在 jar 文件中。
JNIEnv *envx = NULL;
JavaVM * vm = NULL;
env1->GetJavaVM(&vm);
int status = vm->AttachCurrentThread((void **)&envx,NULL);
jclass cls = envx->FindClass("/org/software/initmethod/GetInitValue");
jmethodID mid = envx->GetStaticMethodID(cls,"onRegStateChanged","(II)I");
if(mid==NULL)
{
return 0;
}
printf("In C\n");
envx->CallStaticIntMethod(cls,mid,s1,s2);
vm->DetachCurrentThread();
return 0;
Tomcat 為每個應用程序使用不同的類加載器,因此它可以使它們保持隔離。 也就是說,如果您有一個提供 Consumer 類(作為 Person)的 Web 應用程序和提供相同類名 Consumer(作為一個線程)的其他 Web 應用程序,它可能會導致兩個應用程序(哪個 Consumer 應該由 Tomcat 加載)的沖突和問題?)。 為了回答那個 tomcat,為每個應用程序創建一個 ClassLoader,並使用它們自己的獨立 jars 和類。 正如我們在下圖中看到的,這是 Tomcat 類加載器的層次結構。 問題是您的 JNI 調用正在獲取系統類加載器(默認),它沒有您嘗試調用的類的信息。
Bootstrap
|
System
|
Common
/ \
Catalina Shared
/ \
Webapp1 Webapp2 ...
要解決此問題,您需要找到您的應用程序類加載器。 您可以通過在應用程序中定義的某個類中調用getClass().getClassLoader()
來輕松完成此操作。 這將獲得加載該類的類加載器,我們知道它是您的 Web 應用程序類加載器。 之后,您調用loadClass("foo.bar.ClassThatIWant"
) 方法並獲得所需的類。 在 Java 中,一切都將如下所示:
ClassLoader cl = AWebClass.class.getClassLoader();
Class myClass = cl.loadClass("foo.bar.ClassThatIWant");
在 JNI 中執行以下操作,假設您已將 Web 應用程序類加載器作為名為webCL
的參數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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.