2010-11-25 60 views
1

我遇到了問題。我從VC++調用一個java類。當我從ID運行一個Java程序它工作正常,但是當我部署它在tomcat上它給了我一個異常,當我開始調試它時,我發現它在CLS中返回空。如何在FindClass中給出一個Abosulte路徑,以便它也可以從tomcat調用,並且該類也駐留在jar文件中。從JNI的tomcat調用類的問題

JNIEnv * envx = NULL;

JavaVM * vm = NULL;

env1-> GetJavaVM(& vm);

int status = vm-> AttachCurrentThread((void **)& envx,NULL);

jclass cls = envx-> FindClass(「/ org/software/initmethod/GetInitValue」); (),「(II)I」);}}}}

if(mid==NULL) 

{ 

    return 0; 

} 

printf("In C\n"); 

envx->CallStaticIntMethod(cls,mid,s1,s2); 

vm->DetachCurrentThread(); 

return 0;

+0

請複製代碼和例外。 – 2010-11-25 07:55:07

回答

3

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);