2012-05-13 3 views
1

Я создал C++ dll для приложения Java. У меня есть dll, работающий в приложении, если я запускаю его отдельно, который включает очень длинный командный файл, чтобы получить все правильные аргументы. Я хотел бы попробовать отладить dll, который я создал в Visual Studio 2010. Я попытался помещать командную строку и аргументы в страницу свойств отладки в visual studio. Хотя я не могу правильно запустить приложение.Как debug C++ dll для приложения Java

Командная строка для запуска приложения выглядит следующим образом предполагая, что приложение ApplicationName ...

start "ApplicationName" "C:\AppDirectory\jre\bin\javaw" -D sun.java2d.nodraw=true -Xms24m -Xmx128m -classpath "C:\AppDirectory\classes\;C:\AppDirectory\classes\iText.jar" ApplicationName 

Любые идеи о том, как установить свойство настройки отладки для этого? Любые идеи о том, где я могу найти документацию по этому вопросу?

+2

Есть ли причина, по которой вы не можете создать фиктивное приложение на C++, которое ссылается на dll и проверяет это напрямую? –

ответ

0

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

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

Итак, просто вызовите DebugBreak (см. http://msdn.microsoft.com/en-us/library/windows/desktop/ms679297%28v=vs.85%29.aspx), если в DLL передана специальная опция командной строки.

Когда точка останова отключается, отладчик JIT покажет всплывающее окно, в котором вы можете запустить или прикрепить ваш отладчик.

1

я бы сильно рассмотреть следующие вопросы:

  1. Если возможно, структурируют JNI таким образом, что код, который делает работу ничего не знает о JNI. Получите ли он только родные материалы C++ в качестве аргументов и верните исходный материал C++ в качестве возвращаемых значений, а не вызовите какие-либо функции JNIEnv.
  2. Имейте слой прокладки, который имеет фактические реализации собственных методов в ваших Java-классах. Уровень прокладки будет знать, как вызывать функции JNIEnv для извлечения параметров, превращать их в собственные объекты C++ и передавать их в рабочий код. Аналогично, этот уровень будет знать, как превратить объекты C++ обратно в объекты Java. Например, если рабочая функция возвращает std::string, слой прокладки будет знать, как вызвать функции JNIEnv, чтобы собственный метод возвращал Java String обратно в JVM.

Я понимаю, что вещи не всегда могут быть структурированы таким образом, но есть некоторые хорошие преимущества ему:

  1. Это позволит вам написать программу на C++, чтобы управлять кодом уборщицы непосредственно. Это может сделать намного быстрее и проще протестировать ваш код, а не манипулировать вашим Java-приложением в состоянии, когда он использует ваш код, как вы хотите протестировать.
  2. Вы можете запустить только свой код под отладчиком, valgrind, профайлерами памяти и т. Д. Без необходимости запускать всю JVM под инструментом. Это делает намного проще прикрепить то, что может быть утечка памяти, переполнение буферов и т. Д., Не будучи заваленным «шумом», вызванным внутренними операциями JVM.

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

+0

Если вы напишете его как C++, вы можете иметь что-то вроде SWIG, создавая для вас весь утомительный клей JNI. – Flexo

Смежные вопросы