簡體   English   中英

JNI中tomcat調用類的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM