gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:13 25 4
gpt4 key购买 nike

我已经为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com