2013-05-31 31 views
3

我在调试JNI应用程序时遇到问题。我读过StackOverflow中的几个线程,如this one,this onethis one。我也尝试在独立的shell中启动gdb,并将其附加到正在运行的java进程。在这两种情况下,问题都是一样的:GDB找不到要调试的源代码。事情试图将GDB附加到Eclipse以调试JNI C++代码

  • 添加“目录”行gdbinit,指向C++源代码文件夹
  • 添加C++源代码文件夹复制到Eclipse中的GDB debbuging配置,在“资源”选项卡。
  • 添加设置环境LD_LIBRARY_PATH =/path/to/library.so,正在library.so从C++源文件构建的库文件
  • 将ddd附加到java进程,但随后出现错误,因为pthread_join.c是没有在工作目录中找到。我的硬盘中没有这个文件。我不知道这是怎么回事。

没有工作。我已经花了好几天的时间了。我知道我的错误是在JNI包装器调用的C++代码中,但我无法调试它。任何提示?如果有帮助,我在Mac OS上的Parallels VM下运行Debian 7中的Eclipse Juno。

非常感谢,

回答

2

您需要在您的本机库中有调试信息。您应该将-g传递给您的编译器和链接器,以将这些信息放在可执行文件中。您可能还需要添加-O0

+0

是的,我编译它的方式。实际上,我可以使用GDB/DDD调试C++库,直接调用我想测试的方法。从JNI包装器调用该库时出现问题。 – jorgeas80

2

作为附加到Java进程的替代方法,您可以创建一个C++应用程序并直接进行调试。你只需要链接你想测试的功能。在主函数create the VM中,注册函数为RegisterNatives,并启动使用它们的Java测试类。

希望调试器在查找源代码时没有问题,因为它只是C++应用程序的正常编译/链接/调试循环的一部分。

+0

这听起来很有趣。非常感谢。但我想找到一种方法来调试当前的代码。这是相当庞大和复杂的,我担心如果我失去了上下文,我将无法找到错误。 – jorgeas80

+0

这实际上是一个好主意。你不改变你的应用程序,你只使用本地main()而不是Java main。 –

0

我建议先从最新的ADT bundle开始。您甚至可以下载the Mac version,因此您甚至不需要Parallels(请参阅详细的instructions)。然后,在启动菜单中选择调试Android本机应用程序

+0

感谢您的提示。但我没有在Android上开发。我正在使用通过JNI使用C++库的Java桌面应用程序来执行一些操作。我希望能够使用Eclipse来调试Java和C++部分。 – jorgeas80

+0

哎呀,我错过了这个微小的细节;-) –

+0

没问题。无论如何感谢您的回应:-) – jorgeas80

相关问题