J++ в Java: как перейти с RNI на JNI?
Я унаследовал старый проект J++. Я успешно обновил этот проект до стандартной Sun Java.
Тем не менее, этот проект включает в себя нативный C++ dll, с которым Java-код общается через специфичную для Microsoft среду RNI.
Излишне говорить, что вызов System.loadLibrary("myRniNativeDll") теперь генерирует UnsatisifiedLinkError, говоря, что одна из зависимостей не может быть найдена.
Я совершенно не понимаю, как перенести C++ RNI dll в JNI dll; Я понятия не имею, с чего начать. У меня есть исходный код C++, но я не знаю, как создать DLL JNI. Существуют ли какие-либо советы / учебные пособия / онлайн-материалы, на которые вы можете указать специалистам по Java?
5 ответов
Если лицензирование приемлемо (LGPL), Java Native Access предоставляет более дружественный FFI, чем JNI; портирование может привести к удалению уровня RNI и простому открытию простого C-вызываемого API.
Взгляните на JNA - возможно, будет прямой доступ к RNI DLL; или, по крайней мере, это сделает работу по переносу намного проще, чем выполнение JNI вручную.
Если возможно, я предлагаю вам избежать проблемы портирования RNI -> JNI, переписав код C++ на чистой Java.
Написание кода JNI требует огромных усилий и ставит под угрозу стабильность JVM, если вы ошибаетесь. Мой совет, чтобы избежать этого, если вы можете.
Хотя я никогда не использовал RNI от Microsoft, только JNI от Sun, я ожидаю, что вы не сможете напрямую использовать DLL-библиотеку RNI-стиля, как если бы это была DLL-библиотека JNI-стиля. Я также не знаю ничего, что могло бы автоматически преобразовать или соединить RNI с JNI.
Вы не упоминаете, есть ли у вас источник для C++ RNI DLL, хотя я предполагаю, что вы делаете это, поскольку упоминаете наследование проекта. Если у вас есть опыт работы с C++/C и вы хорошо представляете, какие функции предоставляет библиотека RNI DLL, не должно быть слишком сложно перенести ее в JNI. Время, потраченное на его перенос, скорее всего окупится за то, что оно будет двигаться вперед.
Ссылка, которую вы предоставили на запись JNI в Википедии, содержит множество полезных ссылок по кодированию с помощью JNI. Без более подробной информации трудно дать какой-либо другой совет.
Собственный интерфейс Java: Руководство и спецификация программиста - лучший ресурс, который я нашел для написания кода JNI. Он не охватывает RNI -> JNI, но является отличной * отправной точкой для изучения работы JNI.
* Это на самом деле очень сухо, и не особенно интересно читать, но это лучшее, что я смог найти.