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