C и java совместное использование


Совместное использование определяет или перечисляет между C++ и Java

Начиная с digg в java, начиная с c++. Я вызываю некоторые функции в java из c++ (qt/Android). Я пропускаю способ предопределить некоторые теги, разделяемые между обоими языками, избегая необходимости определять их дважды или используя строки.

определите OPERATION_START 0X01

в c, который будет компилироваться/читаться в java.

Что-то вроде этого существует, или вы знаете какой-то трюк для его достижения?

Изменить: как насчет чего-то вроде этого:

Файл java file.java с

Будет ли это работать? java будет перечислить из 0, как и c, не так ли?

Вам нужно что-то, что может прочитать одно из определений и экспортировать другое. Есть куча вещей, которые могут это сделать. Два из которых я знаю: SWIG и протокольные буферы. SWIG будет читать декларации C++ и генерировать код с одинаковыми вещами на других языках. Буферы протокола будут считывать проприетарное объявление и генерировать код для всех необходимых вам языков.

Вероятно, есть и другие, и я не знаю ничего, что меньше веса. BTW, они также хороши для определения более сложных структур, которые вы хотите передать между C++ и java (и другими языками).

Вы можете моделировать общие определения/перечисления в UML или, возможно, DSL и использовать оттуда генерации кода для создания совпадающих определений на Java и C++.

Или вы могли бы также определить их в Java-классах и построить генератор, который использует отражение для создания соответствующих заголовков C++.

Совместное использование определения или перечислений между C ++ и Java

Начиная DIGG в Java, исходя из C ++. Я звоню некоторые функции в Java от C ++ (Qt / Android). Я скучаю способ предопределить некоторые теги разделяемых между обоими языками, избегая того, чтобы определить их дважды или с использованием строк.


определить OPERATION_START 0x01

в с, которая будет компилироваться / читаемым в Java.

Есть ли что-то подобное существует, или вы знаете какой-то трюк, чтобы достичь его?

Изменить: Как о чем — то вроде этого:

Ява файл stuff.java с

что будет работать? Java будет перечислять от 0 равно как и с, не так ли?

Вам нужно что — то , что можно прочитать одно из определений и экспорта другой. Есть куча вещей , которые могут сделать это. Два , что я знаю , являются: SWIG и протокольные буферы . SWIG прочтет C ++ декларации и генерировать код с теми же вещами на других языках. Протокольные буфера будут читать некоторые запатентованные декларации и генерировать код для всех языков , что вам нужно.

Есть, вероятно, другие, как хорошо, и я не знаю ничего, что есть более легкий вес, чем те. Кстати, те, также хороши для определения более сложных структур, которые вы хотите, чтобы пройти между C ++ и Java (и других языках).

Можно моделировать общие определений / перечислений в UML или, возможно, генерации кода DSL и использовать оттуда, чтобы создать соответствующие определения в Java и C ++.

Или вы могли бы, вероятно, также определить их в классах Java и построить генератор, который использует отражение для создания соответствия C ++ заголовков из этого.

Как подружить Java с системой через написание dll на C++

Окей. Как мне стало известно из изучения Java, что по сути Java не общается с самой операционной системой, она посылает запрос в JVM и обрабатывает его. Например получение Jav’ой доступу к принтеру. Но! Java не может получать доступ к регистру, автозапуску и прочим вещам. Окей я не буду вдаваться в подробности зачем, но просто есть необходимость.

Например у меня есть задача, определена точно ОС — Windows. И мне необходимо «хукать» нажатия клавиатуры, или производить эти нажатия самой программой. Я нашел решение — написание dll библиотеки на C++. Но как мне ее написать. Если мы пишем код на C++ подключая библиотеку windows.h для работы с winapi. И при этом скомпилированный этот код в виде библиотеки подрубаем в Java код. Ничего не потеряется?


1 ответ 1

Из JVM есть несколько дверей в операционную систему — JNI, JNA и JNR. JNI (Java Native Interface) — самый старый и чаще всего используемый способ взаимодействия с нативным кодом. Его минус в том, что он требует от программиста знания C/C++ и хорошего понимания принципов работы виртуальной машины. JNA (Java Native Access) — это надстройка над JNI изолирующая программиста от низкоуровневых деталей за счёт использования рефлексии и libffi. А где рефлексия, там низкая производительность и высокое количество рантайм ошибок. В JNR (Java Native Runtime) рефлексию заменили генерацией байткода, что существенно увеличило производительность. Это относительно молодой проект, я в нём ещё не копался и сказать ничего не могу. А вот пример примитивного кейлогера с использованием JNI показать могу.

Snitch.java

Компилируем командой javac -h . Snitch.java . Ключ -h указывает в каком каталоге создать заголовочный файл с определениями нативных методов.

snitch.c

Компилируем c’шный исходник в snitch.dll, запускаем нашу программу командой java Snitch и убеждаемся, что в C:\Temp\keyboard.txt регистрируются нажатые клавиши.

Илон Маск рекомендует:  Что такое код shm_detach

Чуть более подробно о процессе компиляции и объявлениях JNI-методов можно посмотреть в другом моём ответе.

C и java: совместное использование

В нем следует обратить внимание на обработку строк. Остальные переменные обычно не так сложны. А тут видим, что надо вытащить строку из Unicode в обычный char.
Теперь сделаем dll для нашего проекта. Лучше было бы, чтобы в системе уже был прописан путь до компилятора.
JAVA_HOME — это переменная среды, которую я всегда прописываю. Вообще это путь до директории с установленной JAVA — например, C:\j2sdk15. (Думаю, что это понятно)

cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD JniTest.cpp -FeJniTest.dll

cl — это компилятро С++ из Visual C++. Вы можете использовать любой другой компилятор. Тут важно собрать наши исходники на Си для получения DLL.

Разница между языками программирования C++ и Java

Где применяется Java

И Java, и C++ — объектно-ориентированные языки программирования, но на этом их сходства, пожалуй, заканчиваются, а вот отличий между ними достаточно много.


Начнем с того, что Java — чистый объектно-ориентированный язык программирования; следовательно, в Java все является объектом (однокорневая иерархия, поскольку всё исходит от java.lang.Object).

Для чего нужен С++

В то время как в C++ не существует подобной корневой иерархии. C++ поддерживает как процедурное, так и объектно-ориентированное программирование; поэтому он называется гибридным. Ниже в таблице приведены основные характеристики этих языков и их отличия.

АйТи бубен

Инструменты пользователя

Инструменты сайта

Сравнение C++ с языками Java и C#

Целью создания C++ было расширение возможностей Си, наиболее распространённого языка системного программирования. Ориентированный на ту же самую область применения, C++ унаследовал множество не самых лучших, с теоретической точки зрения, особенностей Си. Перечисленные выше принципы, которых придерживался автор языка, предопределили многие недостатки C++.

В области прикладного программирования альтернативой C++ стал его язык-потомок, Java. Несмотря на преемственность по отношению к C++, Java строилась на принципиально иной основе, её разработчики не были связаны требованиями совместимости с языком-предком и обеспечения максимально достижимой эффективности, благодаря чему они смогли кардинально переработать язык, отказаться от множества синтаксических средств, чтобы добиться идеологической целостности языка. Позже фирма Майкрософт предложила язык C#, представляющий собой ещё одну переработку C++ в том же направлении, что и Java. В дальнейшем появился язык Nemerle, в котором к средствам C# добавлены средства функционального программирования. Ещё позже появилась попытка объединения эффективности C++ с безопасностью и скоростью разработки Java и C# — был предложен язык D, который пока не получил широкого признания.

Java и C++ можно рассматривать как два языка-потомка Си, разработанных из различных соображений и пошедших, вследствие этого, по разным путям. В этой связи представляет интерес сравнение данных языков (всё, сказанное ниже про Java, можно с равным успехом отнести к языкам C# и Nemerle, поскольку в рассматриваемых деталях эти языки отличаются лишь внешне).

C++ сохраняет совместимость с C, насколько это возможно. Java сохраняет внешнее подобие C и C++, но, в действительности, сильно отличается от них — из языка удалено большое число синтаксических средств, объявленных необязательными. В результате программы на Java бывают более громоздки по сравнению с их аналогами на С++. С другой стороны, Java проще, что облегчает как изучение языка, так и создание трансляторов для него.

Java-код компилируются в промежуточный код, который в дальнейшем интерпретируется или компилируется, тогда как C++ изначально ориентирован на компиляцию в машинный код заданной платформы (хотя, теоретически, ничто не мешает создавать для C++ трансляторы в промежуточный код). Это уже определяет разницу в сферах применения языков: Java вряд ли может быть использована при написании таких специфических программ, как драйверы устройств или низкоуровневые системные утилиты. Механизм исполнения Java делает программы, даже откомпилированные (в байт-код) полностью переносимыми. Стандартное окружение и среда исполнения позволяют выполнять программы на Java на любой аппаратной платформе и в любой ОС, без каких-либо изменений, усилия по портированию программ минимальны (при соблюдении рекомендаций по созданию переносимых программ — и вовсе нулевые). Ценой переносимости становится потеря эффективности — работа среды исполнения приводит к дополнительным накладным расходам.

C++ позволяет использовать принцип «захват ресурсов путём инициализации» (RAII), при котором ресурсы ассоциированы с объектом и автоматически освобождаются при разрушении объекта (например, std::vector и std::ifstream). Также возможен подход, когда программист, выделяя ресурсы (память под объекты, открытые файлы и т. п.), обязан явно позаботиться о своевременном их освобождении. Java работает в среде со сборкой мусора, которая автоматически отслеживает прекращение использования объектов и освобождает занимаемую ими память, если в этом есть необходимость, в некоторый неопределённый момент времени. Ручное управление предпочтительнее в системном программировании, где требуется полный контроль над ресурсами, RAII и сборка мусора удобнее в прикладном программировании, поскольку в значительной степени освобождают программиста от необходимости отслеживать момент прекращения использования ресурсов. Сборщик мусора Java требует системных ресурсов, что снижает эффективность выполнения программ, лишает программы на Java детерминированности выполнения и способен следить только за памятью. Файлы, каналы, сокеты, объекты графического интерфейса программист на Java всегда освобождает явно.


В Java есть чётко определённые стандарты на ввод-вывод, графику, геометрию, диалог, доступ к базам данных и прочим типовым приложениям. C++ в этом отношении гораздо более свободен. Стандарты на графику, доступ к базам данных и т. д. являются недостатком, если программист хочет определить свой собственный стандарт.

C++ сохраняет возможность работы с низкоуровневыми указателями. В Java указателей нет. Использование указателей часто является причиной труднообнаруживаемых ошибок, но необходимо для низкоуровневого программирования. В принципе, C++ обладает набором средств (конструкторы и деструкторы, стандартные шаблоны, ссылки), позволяющих почти полностью исключить выделение и освобождение памяти вручную и опасные операции с указателями. Однако такое исключение требует определённой культуры программирования, в то время как в языке Java оно реализуется автоматически.

Илон Маск рекомендует:  Что такое код pcntl_wexitstatus

В отличие от С++, Java является чисто объектно-ориентированным языком, без возможности процедурного программирования. Для объявления свободных функций или глобальных переменных в Java необходимо создавать фиктивные классы, содержащие только static члены . Для задания главной функции даже самой простой программы на Java необходимо поместить её в класс .

в C++ RTTI ограничена возможностью сравнивать типы объектов между собой и с буквальными значениями типов. В системе Java доступна более подробная информация о типах. Эту возможность можно было бы реализовать в C++, имея полную информацию о типах во время компиляции CTTI.

C++ использует препроцессор для включения определений функций и классов, для подключения библиотек, полностью выполненных в исходном коде, а также позволяет осуществлять метапрограммирование с использованием препроцессора, которое, в частности, решает сложные проблемы высокоуровневого дублирования кода[8]. Есть мнение, что этот механизм небезопасен, так как имена макросов препроцессора глобальны, а сами макросы почти никак не связаны с конструкциями языка. Это может приводить к сложным конфликтам имён. С другой точки зрения, C++ предоставляет достаточно средств (константы, шаблоны, встроенные функции) для того, чтобы практически полностью исключить использование препроцессора. Java исключила препроцессор полностью, избавившись разом от всех проблем с его использованием, потеряв при этом возможности метапрограммирования препроцессора и текстовых замен в коде средствами языка.

Отличия языков приводят к ожесточённым спорам между сторонниками двух языков о том, какой язык лучше. Споры эти во многом беспредметны, поскольку сторонники Java считают различия говорящими в пользу Java, а сторонники C++ полагают обратное. Некоторая аргументация устаревает со временем, например, упрёки в неэффективности Java из-за наличия среды исполнения, бывшие справедливыми в первой половине 1990-х годов, в результате лавинообразного роста производительности компьютеров и появления более эффективной техники исполнения (JIT) в значительной мере потеряли актуальность. C++, в свою очередь, развивался, и ряд его недостатков устранён в последних версиях стандарта (например, появился механизм частичной спецификации шаблонов).

Далеко не все программисты являются сторонниками одного из языков. По мнению большинства программистов, Java и C++ не являются конкурентами, потому что обладают различными областями применимости. Другие считают, что выбор языка для многих задач является вопросом личного вкуса.

Блог только про Java

Учимся программировать на Java с нуля

Взаимосвязь между Java и языками С, С++ и C#

Язык Java очень похож на языки С и С++. От С язык Java унаследовал синтаксис, а от С++ — объектную модель.

Сходство Java с языками С и С++ играет важную роль. Во-первых, многие программисты знакомы с синтаксисом С и С++, что упрощает изу­чение языка Java. Те же, кто освоил Java, могут без труда изучить С и С++.

Во-вторых, тем, кто программирует на Java, не приходится изобретать колесо. Они могут успешно применять уже известные и хорошо зарекомендовавшие себя подходы.

Современная эпоха в программировании, по существу, началась с языка С. Затем поя­вился язык С++, а после него — Java.


Имея такое богатое наследство, Java предоставля­ет программистам производительную и логически согласованную среду, в которой были реализованы лучшие из уже известных решений и добавлены новые средства, необхо­димые для интерактивной среды.

Очень важно отметить тот факт, что вследствие своей схожести языки С, С++ и Java сформировали концептуальную основу для профессио­нального программирования.

При переходе от одного языка к другому программистамне приходится преодолевать глубокие «пропасти» принципиального характера.

Один из принципов проектирования, заложенных в основу С и С++, заключается в предоставлении программисту широчайших полномочий.

Разработчики Java также сле­довали этому принципу. Если не учитывать ограничения, накладываемые средой Интер­нета, то следует признать, что Java предоставляет программисту полный контроль над кодом.

Если вы умеете грамотно программировать, это будет видно по вашим програм­мам. Недостаток опыта также отразится на ваших программах. Одним словом, Java-язык не для дилетантов, а для профессионалов.

У Java имеется еще одно сходство с языками С и С++: все эти языки были задуманы, разработаны, проверены и уточнены программистами-практиками.

В их основу поло­жены реальные потребности их создателей. При таком подходе к разработке языка программирования велика вероятность получить качественный продукт, способный найти признание у специалистов.

Из-за сходства языков Java и С++, в особенности из-за подобия предоставляемых ими средств для объектно-ориентированного программирования, возникает соблазн рассматривать Java как своего рода версию С++ для Интернета.

Но это было бы ошиб­кой. У Java имеется целый ряд существенных отличий от С++ как в концептуальном,так и в прикладном плане.

Несмотря на то что С++ оказал очень сильное влияние наязык Java, последний вовсе не является расширенной версией первого.

В частности, эти языки не совместимы ни сверху вниз, ни снизу вверх. Конечно, сходство с языком С++ очень важно, и если у вас имеется опыт программирования на С++, вы будете чувство­вать себя в своей стихии, программируя на Java.

Но не следует забывать, что Java был разработан не на замену С++, а для решения вполне определенного круга задач, отлича­ющихся от тех, что решаются с помощью С++.


Именно поэтому мирное сосуществова­ние Java и С++ будет продолжаться еще многие годы.

Через несколько лет после создания Java корпорация Microsoft разработала язык С#. И это очень важно, поскольку С# тесно связан с Java.

В самом деле, у многих языковых средств С# имеются свои аналоги в Java. В Java и С# используется единый общий син­таксис, похожий на синтаксис С++, поддерживается распределенное программированиеи применяется одна и та же объектная модель.

Илон Маск рекомендует:  Псевдоэлемент -ms-check в CSS

Разумеется, у Java и С# имеются отличия, но внешне эти языки очень похожи. Это означает, что, зная С#, вы сможете относитель­но легко изучить Java, и, наоборот, если вам предстоит изучить С#, знание Java может очень пригодиться.

Учитывая сходство Java и С#, вы можете спросить: «Заменит ли С# язык Java?» Без­условно, ответ на этот вопрос будет отрицательным.

Java и С# оптимизированы для аб­солютно разных типов вычислительных сред. Как и вместе с языком С++, Java будет мирно сосуществовать с языком С# еще многие годы.

Совместное использование POJOs между Android project и Java backend project

Я задавался вопросом, что было бы лучшим способом совместного использования тех же POJOs в проекте Android и во внутреннем проекте.

В тот момент, когда у меня есть POJO в back-end, тогда у этого POJO есть аннотации Hibernate и Jackson. В верхней части класса есть предложения HQL как @NameQueries.
Когда мне нужно то же POJO в проекте Android, затем скопируйте POJO и удалите все аннотации. На данный момент я использую GSON в проекте Android.

Поэтому мой вопрос заключается в том, что было бы лучшим способом избавиться от этой утомительной работы, когда я создаю новый POJO в фоновом режиме, и мне это нужно в проекте Android тоже.

До сих пор я думал о создании проекта lib, но я не понял, как я могу контролировать аннотации. В Android side я тоже могу работать с Джексоном, но я хотел бы избавиться от вещей Hibernate.

4 ответа

я думаю, что GSON был бы вашим лучшим выбором. но остерегайтесь, что в спящем режиме с отношениями(один ко многим, многие ко многим) может вызвать ошибку из-за того, что при разборе в json get вызывается метод полей, вам нужно указать, если поле должно быть нетерпеливо или лениво извлечено. если вам не нужно поле в android, вы можете просто использовать @Expose аннотацию в pojo в backend, чтобы указать, какие поля должны быть выставлены или преобразованы в json. я думаю @Expose , что только availbe в JSON google

Также предлагаем посмотреть Jackson it’s one of two most popular JSON read/write library (another one GSON is mentioned above).


Также функции, такие как пользовательские сериализаторы и десериализаторы.

Лучший способ-использовать «схему» сериализации (за неимением лучшего слова) для сериализации POJO в сериализованный поток, который может быть демаршализован Android.

Наиболее распространенным форматом, используемым в современной технологии программирования, является JSON, поэтому, используя JSON в виду, вы можете создать сервис, который будет отображать ваш POJO к объекту JSON, и Ваше приложение Android десериализует его из JSON в POJO.

Служба может быть веб-службой Restful или пользовательской службой, предоставляющей POJO в JSON.

Java 7 теперь включает в себя JSR-353, JSON Processing (JSON-P для краткости), и это дает различные функциональные возможности и классы для обеспечения JSON маршалинга и unmarshalling. Простой учебник можно найти здесь .

В вашем Android-приложении, вы можете использовать GSON, чтобы сделать JSON unmarshalling.

Надеюсь, это поможет.

Я вижу привлекательность совместного использования этих POJOs через два, но я думаю, что лучшим вариантом было бы создать простой набор DTOs в общей lib и использовать их из задней части и android. Проблема с наличием одних и тех же фактических объектов домена в обоих проектах — это именно то, что вы описали, — что вы делаете в них вещи типа back end, которые не принадлежат интерфейсу.

Простой пример для клиента (у которого есть некоторое пересечение с шаблоном builder, чтобы вы могли повторно использовать эти DTO от builder):

Тогда ваш DTO будет простой версией в вашей общей библиотеке и не должен нуждаться в комментариях Джексона, так как он автоматически будет включать только то, что вы хотите на клиенте. Как вы сказали, хотя, если вам действительно нужны некоторые Джексон аннотации, что хорошо на стороне Android. Это DTO вы бы отправить обратно из задней части:

В то время как это по-прежнему заканчивается дублированием (между соответствующим доменным объектом и DTO), это означает, что если вы что-то изменяете в задней части, это должно также измениться в DTO, чтобы клиент видел, и клиент поэтому хранится в синхронизации, потому что он использует тот же DTO.

Подружить Java и C++

Пердположим, у меня есть такой код на C++:


В Java я хочу сделать так:

Как проще всего сгенерировать всю JNI-лапшу, которая должна быть между этими кусками кода?

Интерфейс выстави сишный и заверни в extern «C».

А можно, я несмешно пошучу?

В жабке
class MyClass <
native void func();
>

где-то походу дела подгрузить so-шку

в СОшке функция
void Java_my_pakage_MyClass_func() <
>

Ну и потом в жабки позвать MyClass.func();

По вкусу приправить код статиками, агрументами фций, принтами и т.д.

А как работаеть с передаваемыми java-типами? Как получить доступ к `this`?

Совместное использование данных между C++/c и Java

Я работаю с процессом переменного тока, который читает датчик окружающей среды через поток, каждую секунду он читает 1000 образцов о освещении, температуре и звуке окружающей среды, теперь я хотел бы прочитать эти данные с помощью Java-программы. Я знаю, что есть решения например, поделиться памятью, но я ищу хороший учебник, руководство, пример, который может помочь мне в достижении моей цели.

1 ответ

Вы можете использовать простой JNI или использовать один из JACE или JNA, в зависимости от того, что вам больше подходит, в зависимости от того, хотите ли вы вызывать код C++ из Java или наоборот. Все три хорошо документированы в сети.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL