Здравствуйте, ., Вы писали:
.>On 23/12/2009 01:54, Jakop wrote:
>> .>А зачем? Ведь гораздо проще юнит-тестить из явы.
>> Это если ты дебажишь обычный явоввский код. Я же дебажу явовский код
>> который юзает jni. Описанным выше способом, я бедажу dll и so
>> библиотеки jni. C-ный код дебажить то тоже нужно, особенно если его
>> несколько тысяч строк как у меня
.>Я просто подключаюсь MSVS express edition к процессу java.exe — всё прекрасно отлаживается. Кстати, прекрасно работают оба отладчика одновременно: Java и C. Под линухом не знаю, не пробовал...
Это да, но порой удобнее бывает, все-таки, инициировать отладку под студией чтобы не запускать процесс в яве и аттачить отладчик.
1)Мне чтобы отладиться нужно просто нажать f5.
2) Чтобы зааттачиться к яве нужно самому как-то запустить свое приложение отдельно и зааттачить отладчик студии к яве под которой работает мое приложение.
3) Бывает, что падает сам jni код, привем падает еще до того, как ты сможешь руками запустить отладчик и чтобы понять это лучше запустить ява-машину самому так как в этом случае сработают бряки в твоем процессе и сработают сразу
4) Я иногда использую гибридную отладку jni кода. Например я пишу большой кусок на C++. Чтобы его проверить первоначально, когда он еще вообще никак не отлажен я делаю так: создаю java объекты, которые нужны для вызова, запускаю функцию jni вызывая ее как обычную функцию на C. После отладки прогоняю тест вызывая функцию как java функцию. Обычно к этому моменту уже все работает и мне не надо аттачить отладчик студии много раз.
Пример:
jmethodID constructorID = p_env->GetMethodID (jniConnector, "<init>", "()V");
jobject connector = p_env->NewObject (jniConnector, constructorID);
jstring ip = p_env->NewStringUTF (str_ip.c_str());
jstring port = p_env->NewStringUTF (str_port.c_str());
jboolean bres = Java_xxx_xxxxxx_xxxxxx_jniConnector_init(p_env, 0, ip, port);
Поскольку я не использую this java объекта, то функция init спокойно принимает 0 в качестве instance-а объекта. Далее я отлажываю код, как обычный код C.
не убедил ?