2012-02-24 79 views
11

如何在GetMethodID函數簽名參數中指定我獲取id的函數接受自定義類的數組?如何在GetMethodID方法簽名參數中指定類的數組?

我在用java簽名一個功能:

void getData(ListDataClass[] arryData) 

而且我想使用的GetMethodID功能JNI接口此功能的方法ID。
對於我已經在函數簽名參數提到如下:

"([myPackeg/ListDataClass)V" 

但這不是工作,我得到異常作爲Method Not Found。如果我指定數組的字符串類,那麼同樣的事情就行

+0

你從主線程或從不同的線程中調用?如果您是從其他線程(例如您在本機代碼中創建的線程)進行調用,則需要執行其他操作。 – 2012-02-24 17:06:00

+0

@Alex你是說什麼其他的東西?我是從不同的線程調用而出現錯誤。 – nabroyan 2013-08-15 07:40:52

回答

23

爲完全合格的類JNI類型簽名採取以下形式:

Lclass/path/ClassName; 

例如:

"Ljava/lang/String;" // String 
"[Ljava/lang/String;" // String[] (array) 

的方法簽名從這些首先將參數括號內,並且建立了右括號後的返回類型。例如:

long f (int n, String s, int[] arr); // Java method 
"(ILjava/lang/String;[I)J" // JNI type signature 

你可以找到爲JNI類型簽名here,這是我借來的,從上面的例子中的文檔。

在你的具體的例子:

void getData(ListDataClass[] arryData) // Java method 
"([Lclass/path/ListDataClass;)V" // JNI type signature 

注:確切類型簽名取決於你的類路徑上。

然後你可以找到方法ID如下(假設C++和JNIEnv的指針稱爲ENV):

jclass clz = env->FindClass("class/path/ListDataClass"); 
jmethodID mid = env->GetMethodID(clz, "getData", "([Lclass/path/ListDataClass;)V"); 
+0

你有一個錯字:'([Lclass/path/ListDataClass;)V',不是'(L [class/path/ListDataClass;)V' – ankhzet 2015-08-20 05:00:40

+0

修復了這個,謝謝 – GooseSerbus 2015-08-21 13:50:27

相關問題