java - 如何为 Java 应用程序调试 C++ dll

标签 java c++ debugging dll visual-studio-debugging

我已经为 java 应用程序创建了一个 C++ dll。如果我单独启动它,我会在应用程序中运行 dll,其中包括一个非常冗长的批处理文件以获取所有正确的参数。我想尝试调试我在 Visual Studio 2010 中创建的 dll。我尝试将命令行和参数放入 Visual Studio 的调试属性页中。尽管我无法让应用程序正确启动。

启动应用程序的命令行如下所示,假设应用程序是 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

关于如何为此设置调试设置的任何想法? 关于在哪里可以找到相关文档的任何想法?

最佳答案

我会强烈考虑以下几点:

  1. 如果可能,构造 JNI,使执行工作的代码对 JNI 一无所知。让它仅接收 native C++ 内容作为参数并返回 native C++ 内容作为返回值,而不调用任何 JNIEnv 函数。
  2. 有一个填充层,它具有 Java 类中 native 方法的实际实现。 shim 层将知道如何调用 JNIEnv 函数来提取参数,将它们转换为 native C++ 对象并将它们传递给工作代码。同样,该层将知道如何将 C++ 对象转回 Java 对象。例如,如果一个辅助函数返回一个 std::string,shim 层将知道如何调用 JNIEnv 函数让本地方法返回一个 Java String 给虚拟机。

我知道事情不能总是以这种方式构建,但它有一些很好的优点:

  1. 它将允许您编写一个 C++ 程序来直接驱动工作代码。这可以让您更快、更轻松地测试您的代码,而不必将您的 Java 应用程序操作到它正在使用您的代码进行测试的状态。
  2. 您将能够在调试器、valgrind、内存分析器等下运行您的代码,而不必在该工具下运行整个 JVM。这使得确定哪些内存可能泄漏、缓冲区溢出等变得大大容易,而不会被 JVM 内部操作引起的“噪音”所淹没。

的确,这种方法意味着垫片层没有经过测试。但由于 shim 层仅在 Java 世界和 C++ 世界之间转换对象,因此它有望非常简单,因此适合在完整 Java 应用程序的上下文中进行测试。

关于java - 如何为 Java 应用程序调试 C++ dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10575308/

相关文章:

java - GridBagLayout anchor 和 JScrollPane 问题

java - 使用rmi而不直接连接数据库有什么好处

java - 如何调用 switch 语句返回类型

java - Servlet 在启动时使用计时器类在固定时间间隔后触发事件?

c++ - 多线程应用程序中的访问冲突,C++

C++:寻找 "returning address of local variable..."的更正

c++ - 覆盖写入控制台的文本

java - Java 中是否有零时间、启动(无需重新编译)可切换条件标志?

visual-studio-2010 - Visual Studio - 如何将默认构建配置更改为发布?

关闭连接后 Java TLS session 重用