Я хочу связать JAVA Swing GUI с C ++ бэкэнд для отдельного приложения. Эти два формируют два разных проекта. Я читал о Java родной Интерфейс. Хотя JNI кажется лучшим решением для этого, у меня есть несколько вопросов относительно JNI:
Будучи новичком в JNI, будет полезна подробная техническая помощь.
JNI помогает нам выполнять вызовы нашей собственной библиотеки C ++ из Java.
Я предполагаю, что вы планируете, чтобы GUI и C ++ были в одном процессе (если да, то JNI — ответ, если нет, вам придется прибегнуть к внутрипроцессному взаимодействию).
Java — это управляемая память, что означает, что вы не имеете истинного владения памятью (всемогущий ГК решает, удалит он что-либо или нет).
C ++ — неуправляемая память, а это означает, что вам придется собирать свой собственный мусор.
Учитывая это различие, совершенно очевидно, что при взаимодействии друг с другом вы должны быть уверены, что не удалили память, выделенную в одном из другого.
Это одно из отличий, которое вы столкнетесь с привязкой файлов в одном проекте.
Другая причина в том, что вы прибегаете к динамическому связыванию.
Код из Java компилируется в промежуточный, а код из C ++ компилируется в специфичный для CPU ассемблер. Это означает, что вы не можете использовать код из одного в другой.
Поэтому мы прибегаем к динамическому связыванию.
Код C ++ будет скомпилирован в общую библиотеку (.so или .dll в зависимости от платформы). Во время выполнения ваше Java-приложение Swing (которое будет точкой входа) загрузит динамическую библиотеку в память программы (вам нужно будет вызывать ее вручную из своего кода, System.loadLibrary — это функция, если я правильно помню).
Как только библиотека загружена, если вы правильно собрали библиотеку (для этого вам нужно следовать учебным пособиям, я не буду объяснять это здесь), вы получите экспортированные символы .dll в java.
Обычной практикой при использовании JNI является создание библиотеки мостов, которая связывает ряд функций C ++ с классом мостов в Java.
Существуют автоматические программы, которые создают этот мост для вас (например, SWIG), но я настоятельно рекомендую вам избегать их (особенно потому, что у вас нет полного понимания JNI).