2012-07-06 31 views
0

目前在我的應用程序中,我使用C++(核心實現)和java(服務和演示文稿)。現在在我的C++內核中,我收到了一個異常,我在JNI代碼中捕獲異常,並創建它的一個可拋出的對象,並將其扔到java層。這樣可以進一步處理。無法在JNI中調用ctor?

有關JNI捕捉例外,我現在用下面的代碼,

catch (namespace::MyException& excep) { 
    jclass ex = jenv->FindClass("namespace/MyException"); 
    jmethodID constructor; 
    jthrowable object; 
    jobject obj; 
    if (ex) 
    { 
      constructor = jenv->GetMethodID(ex, "<init>", "(Ljava/lang/String;Ljava/lang/String;I;I)V"); 
      if(!constructor) 
      { 
       SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, (char*) excep.what()); 
       return $null; 
      } 

      jstring str = jenv->NewStringUTF(excep.what()); 
      jstring str2 = jenv->NewStringUTF(excep.GetStackTraceAsString()); 
      obj = jenv->NewObject(ex, constructor, str, str2,excep.GetCat(),excep.GetCate()); 

      object = static_cast<jthrowable>(obj); 
      jenv->DeleteLocalRef(str); 
      jenv->DeleteLocalRef(str2); 
      jenv->Throw(object); 
    } 
    return $null; 
} 

我的MyException類C++簽名

MyException(string str1, string str2, int cat1, int cat2); 

但在我的JNI代碼,我沒能得到放在methodID對於MyException CTOR。

任何人都可以告訴我在JNI代碼中出了什麼問題。我懷疑是在GetMethodId()中的parameterList中存在一些問題。

回答

3

簽名中的基元之間不應該有分號。它應該是這樣的:

(Ljava/lang/String;Ljava/lang/String;II)V 

通知的II,不I;I


編輯

你總是可以運行在你創建的類javap -s <package.name.ClassName>

+0

感謝maba它爲我工作。但我懷疑爲什麼這種原始類型的改變。 – 2012-07-06 12:31:49

+0

那麼分號是結束類名定義。設想一個叫做ASCII的類。簽名的名稱將不得不以某種方式終止; 'LASCII;'。 – maba 2012-07-06 12:37:36

+0

你可以建議我一個可以參考的地方,讓我的問題解決JNI? – 2012-07-06 12:45:22