2012-02-01 29 views
5

返回一個對象的結果我有一個Java函數返回一個類JNI調用Java函數中的NoSuchMethodError

public static synchronized MyClass getInstance() throws MyClassException{ 
    if (instance == NULL){ 
     // create 
    } 
    return instance; 
} 

我想通過C到調用此++代碼的單一實例,但是當我做,它返回一個NoSuchMethodError。

cls = jenv->FindClass("MyClass"); 
if (cls == NULL) 
{ 
//error handling 
} 
mid = jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass"); 
if (mid == NULL) 
{ 
//error handling 
} 

當我運行:

javap -s -p on MyClass, I get the signature: 
public static synchronized MyClass getInstance() throws MyClassException; 
Signature:()LMyClass; 

如果我改變函數簽名在Java類作廢,該GetStaticMethodID通話按預期工作。

我是否需要設置一個jobject以期望來自該調用的返回值?

這可能沒有先調用GetStaticMethodID?

+0

哪裏是多數民衆贊成在返回錯誤的調用? – 2012-02-01 20:09:51

+0

當我運行C++應用程序時,得到:線程「main」中的異常java.lang.NoSuchMethodError:getInstance – donalmg 2012-02-01 20:16:09

+0

我想知道是否需要在調用GetStaticMethodId時指定「MyClass」的完全限定路徑。例如: jenv-> GetStaticMethodID(cls,「getInstance」,「()Lcom/work/MyClass;」); 取決於CPP代碼相對於Java代碼的位置?只是一個想法。 – eternaln00b 2012-02-01 20:19:59

回答

1

我認爲問題在於它無法解析指定的輸出參數。如果您的Java類是在包:「COM /工作/」,你會說:

jenv->GetStaticMethodID(cls, "getInstance", "()Lcom/work/MyClass;"); 

應該這樣做。

編輯:

它看起來像答案是javap的輸出是不是?你應該做的事:

jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass;"); 
+0

在我原來的問題中輸入錯字。我有這個**()LMyClass ** – donalmg 2012-02-01 20:44:18

+0

而你明確地說過「()LMyClass;」用分號結尾? – eternaln00b 2012-02-01 20:51:46

+0

例如,我可以這樣做: getStaticMethodID(cls,「currentThread」,「()Ljava/lang/Thread;」); 而且工作正常。那對你有用嗎? – eternaln00b 2012-02-01 20:58:12