Как указать массив класса в параметре подписи метода GetMethodID? - PullRequest
11 голосов
/ 24 февраля 2012

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

У меня есть одна функция в Java с подписью:

void getData( ListDataClass[] arryData )

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

"([myPackeg/ListDataClass)V"

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

1 Ответ

29 голосов
/ 24 февраля 2012

Сигнатуры типа 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

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

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

jclass clz = env->FindClass("class/path/ListDataClass");
jmethodID mid = env->GetMethodID(clz, "getData", "([Lclass/path/ListDataClass;)V");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...