Как указать массив класса в параметре подписи метода GetMethodID?

Как указать в параметре подписи GetMethodID функцию, что функция, которой я получаю идентификатор, принимает массив пользовательского класса?

У меня есть одна функция в java с сигнатурой:

void getData( ListDataClass[] arryData )

И я хочу получить идентификатор метода этой функции из интерфейса JNI, используя функцию GetMethodID.
Для этого я упомянул в параметре подписи функции следующим образом:

"([myPackeg/ListDataClass)V"

Но это не работает, и я получаю исключение как Method Not Found. То же самое работает, если я укажу массив класса string.

Ответ 1

Подписи типа 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 здесь, где я взял предыдущий пример из.

В вашем конкретном примере:

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

Примечание: точная подпись типа зависит от пути вашего класса.

Затем вы можете найти идентификатор метода следующим образом (предполагая, что С++ и указатель JNIEnv env):

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