Ответ 1
За вопрос №1:
Вы можете использовать jchar. Примитивные символы в java не подписаны, а о единственном примитиве, который не является. Обратите внимание, что jchar является UTF-16 char, поэтому вам придется "сопоставить" jchar с обычным char, как и с любой проблемой преобразования символов. Для простых преобразований это обычно можно выполнить путем литья
char c_char = (char)java_char;
поскольку основной ASCII имеет одни и те же числовые значения между ASCII и UTF-16. Однако это подвержено ошибкам, если кто-то действительно попытается передать "специальный" символ через интерфейс. Лучше всего было бы (в java-стороне, как это проще) преобразовать символы в байты, используя соответствующий набор символов для вашей платформы (чтобы обеспечить совместимость платформ в слоях C). Затем вам нужно только передать байт [] в JNI-вызов, и байты будут правильно соответствовать символам, которые вероятнее всего ожидаются.
За вопрос №2:
Если ваш метод CheckEnrollmentExists(...)
является точкой входа привязки JNI, вы не можете безопасно изменять типы данных. Это означает, что все входные данные должны быть значениями типа данных JNI. Хотя вы можете выбрать эквиваленты типа данных C (и вы, возможно, сможете заставить свой компилятор сделать это в любом случае), следует избегать таких методов. Это неявно означает, что точки входа JNI не могут принимать структуру структурных данных, не определенную в заголовках JNI. Другими словами, вы не можете передать свою собственную структуру методу.
Если для метода требуется доступ к C-структуре через вызовы, используйте другое средство. Я видел, как люди сохраняют указатель на выделенную структуру данных в целочисленном или длинном члене (правильное кастинг). Затем вы можете переписать исходную кодовую часть для извлечения указателя из объекта "this", передаваемого в вызов, и сделать разыменование для получения требуемых данных.
Для вопроса № 3:
Это на самом деле то же самое, что и вопрос №2. В "привязывающей обертке", которую вы положили, вы должны получить хранимое значение указателя в объекте int или long, а затем передать его внутреннему методу. Поскольку передача указателя является вызовом от C до C, никакой дополнительной магии не требуется.