2017-05-30 29 views
0

根據這file完全合格的類簽名是Lfully-defined-class。 ex。 String - >Ljava/lang/stringJNI:返回用戶定義的java類時使用什麼簽名?

用戶定義的類怎麼樣?他們是否也被認爲是完全定義的類? 例如,我創建了一個類Container。我可以使用"LContainer"作爲簽名嗎?我知道我的其他代碼工作時,我使用簡單的字符串例如,但是當我用我自己的用戶定義的類替換它,出於某種原因,我可能會丟失,它不再工作。

getClass是一種返回Container類型值的靜態方法。我的簽名是否正確? ()LContainer

jmethodID mid = env->GetStaticMethodID(clazz, "getClass", "()LContainer") 

請讓我知道您的想法。在此先感謝

+0

您停止猜測並使用'javap -s'的輸出。這絕不是錯的。 – EJP

回答

1

Oracle JavaOpenJDK提供javap工具,用JNI簽名有助於指出缺少的分號。

例如,要查找probablePrime方法的簽名在BigInteger類:

javap -s java.math.BigInteger | grep -A 2 "probablePrime" 

public static java.math.BigInteger probablePrime(int, java.util.Random); 
    descriptor: (ILjava/util/Random;)Ljava/math/BigInteger; 

- 正如與java,提供類路徑已編譯的.class文件。

雖然這不會直接爲您提供類的簽名,但確實有一些引用類的方法或字段,因此可以在某處找到類描述符。

+0

謝謝,這幫了很多。 – winux

0

假設Container是包com.contosso,你需要"()Lcom/contosso/Container;"

我不知道在哪裏Container是在默認包中,你將如何處理這種情況。最明顯的是workround將其移動到一個包:-)

感謝user2543253在規範

+0

如果Container不在任何包裝中?我認爲LContainer會工作,因爲當我測試返回一個整數時,格式()我爲我工作。不幸的是LContainer不起作用。 – winux

+1

你最後錯過了';'(和OP一樣)。 – user2543253

+0

Martin Bonner,就我而言,我的.java文件與我當前工作目錄的C++位於同一目錄中。您可以設置CLASSPATH「。」然後使用JavaVMOption結構訪問其成員選項以分配類路徑。現在FindClass需要知道的是類名 – winux

相關問題