J ++ в Java: как перейти с RNI на JNI? - PullRequest
3 голосов
/ 14 сентября 2009

Я унаследовал устаревший проект J ++. Я успешно обновил этот проект до стандартной Sun Java.

Тем не менее, этот проект включает в себя собственный C ++ dll, с которым Java-код общается через специфическую для Microsoft среду RNI .

Нет необходимости говорить, что вызов System.loadLibrary ("myRniNativeDll") теперь генерирует UnsatisifiedLinkError, говоря, что одна из зависимостей не найдена.

Я совершенно не понимаю, как перенести C ++ RNI dll в JNI dll; Я понятия не имею, с чего начать. У меня есть исходный код C ++, но я не знаю, как создать DLL JNI. Существуют ли какие-либо советы / учебные пособия / онлайн-материалы, на которые вы можете указать специалистам по Java?

Ответы [ 5 ]

3 голосов
/ 16 сентября 2009

Взгляните на JNA - может быть возможно получить прямой доступ к RNI DLL; или, по крайней мере, это сделает работу по переносу намного проще, чем выполнение JNI вручную.

3 голосов
/ 16 сентября 2009

Если лицензирование приемлемо (LGPL), Собственный доступ Java предоставляет более дружественный FFI, чем JNI; портирование может привести к удалению уровня RNI и простому открытию простого C-вызываемого API.

2 голосов
/ 14 сентября 2009

Если возможно, я предлагаю вам избежать проблемы портирования RNI -> JNI, переписав код C ++ на чистом Java.

Написание кода JNI требует огромных усилий и подвергает риску стабильность JVM, если вы ошиблись. Мой совет, чтобы избежать этого, если вы можете.

1 голос
/ 16 сентября 2009

Собственный интерфейс Java: Руководство и спецификация программиста - лучший ресурс, который я нашел для написания кода JNI. Он не охватывает RNI -> JNI, но является отличной * отправной точкой для изучения работы JNI.

* На самом деле это очень сухо, и читать не особенно весело, но это лучшее, что я смог найти.

1 голос
/ 14 сентября 2009

Хотя я никогда не использовал RNI от Microsoft, только JNI от Sun, я ожидаю, что вы не сможете напрямую использовать DLL-библиотеку RNI-стиля, как если бы это была DLL-библиотека JNI. Я также не знаю ничего, что могло бы автоматически преобразовать или соединить RNI с JNI.

Вы не упоминаете, есть ли у вас источник для C ++ RNI DLL, хотя я предполагаю, что вы делаете это, так как упоминаете наследование проекта. Если у вас есть опыт работы с C ++ / C и вы хорошо представляете, какие функции предоставляет библиотека RNI DLL, не должно быть слишком сложно переместить ее в JNI. Время, потраченное на портирование, вероятно, окупится за поддержание его движения вперед.

Ссылка, которую вы указали на запись JNI в Википедии , содержит множество полезных ссылок по кодированию с использованием JNI. Без дополнительных подробностей трудно дать какой-либо другой совет.

...