Отладка IntelliJ JNI

У меня есть приложение для Android, которое обрабатывает звук в реальном времени. Поскольку эта задача критична по времени, я написал код, выполняющий обработку, на C++, остальная часть приложения - это Java. Android Studio поддерживает отладку JNI без каких-либо вопросов, что облегчило мне написание кода. Затем я оставил код в покое и тем временем решил избавиться от Android Studio и вместо этого использовать IntelliJ.

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

Я также попытался установить точку останова в java-коде непосредственно перед собственным вызовом и надеялся, что, нажав «Step in», он войдет в собственный код, но вместо этого InteliJ просто пропустил его.

Кроме того, конфигурация запуска с включенной двойной отладкой (которую я тогда создал в Android Studio), похоже, не работает (Android Studio использовала для загрузки тонны библиотек при запуске собственного отладчика, IntelliJ этого не делает).

Мне это кажется странным, поскольку, согласно официальному сообщению в блоге JetBrain, IntelliJ имеет все функции Android Studio, кроме мастера настройки проекта. Что мне здесь не хватает?

Кстати, я знаю о этот вопрос, но его ответы устарели.

Как вы строите библиотеку C++? Вы используете Visual Studio?

Daniele 21.05.2018 22:05

Нет, я использую цель gradle externalNativeBuild

vatbub 21.05.2018 22:10

И я редактировал файлы с помощью Android Studio, поскольку Android Studio также поддерживает редактирование C++.

vatbub 21.05.2018 22:13

Итак, один из способов отладки вашей DLL (если вы работаете в Windows) - это создать DLL в режиме отладки и присоединить отладчик Visual Studio к вашему процессу Java. Но без сборки VS это решение неприменимо.

Daniele 21.05.2018 22:14

Насколько я понял процесс сборки jni, gradle вызывает clang, который, в свою очередь, компилирует C++ в libSomething.so.

vatbub 21.05.2018 22:18

Но в любом случае, как вы предлагаете компилировать / отлаживать код JNI в VS?

vatbub 21.05.2018 22:19

Что ж, если у вас уже есть сборка VS, которая создает вашу DLL, VS может быть присоединен к процессу (вам нужен PID запущенного процесса), точки останова могут быть вставлены из VS. См. msdn.microsoft.com/en-us/library/3s68z0b3.aspx

Daniele 21.05.2018 22:23

Я использовал это некоторое время назад для отладки Quantlib (C++) при вызове через JNI, VS весьма удобен

Daniele 21.05.2018 22:25

Но я вижу, что Android Studio использует lldb.llvm.org, возможно, вы можете найти справку о том, как использовать этот другой отладчик

Daniele 21.05.2018 22:26

Я понимаю, к чему вы клоните, но не думаю, что это возможно. Я говорю о приложении для Android, которое работает на моем телефоне Android, а не на моем компьютере. Я могу отлаживать java-код через USB и в Android Studio, раньше я мог делать то же самое с C++. Но поскольку он не запущен на моей машине, нет Java-процесса, к которому VS могла бы присоединиться.

vatbub 21.05.2018 22:27

Что ж, если вам нужно отладить взаимодействие приложения Android и библиотеки C++ во время работы на вашем телефоне, тогда перенос всего обратно в Android Studio кажется единственным выбором (и AS очень эффективен в этом отношении). Более легкий подход к отладке заключался бы в использовании той же библиотеки C++ в другом приложении Java (если вы можете передать библиотеке те же данные, и вы можете игнорировать фактическое взаимодействие с телефоном). В любом случае .. удачи :)

Daniele 21.05.2018 22:40

Я хотел избежать одновременной установки Android Studio и IntelliJ, поскольку они по сути являются одним и тем же программным обеспечением. Но, поскольку лучшего решения, похоже, нет, думаю, мне придется вернуться к AS. Итак, «Android Studio и IntelliJ эквивалентны, за исключением мастера настройки проекта»: /

vatbub 21.05.2018 23:25

Если вы не возражаете перефразировать свои комментарии как ответ @Daniele, я бы отметил это как решение, так как это может решить проблему для некоторых людей.

vatbub 21.05.2018 23:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
13
1 246
0

Другие вопросы по теме