我已经为 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
关于如何为此设置调试设置的任何想法? 关于在哪里可以找到相关文档的任何想法?
最佳答案
我会强烈考虑以下几点:
- 如果可能,构造 JNI,使执行工作的代码对 JNI 一无所知。让它仅接收 native C++ 内容作为参数并返回 native C++ 内容作为返回值,而不调用任何 JNIEnv 函数。
- 有一个填充层,它具有 Java 类中 native 方法的实际实现。 shim 层将知道如何调用 JNIEnv 函数来提取参数,将它们转换为 native C++ 对象并将它们传递给工作代码。同样,该层将知道如何将 C++ 对象转回 Java 对象。例如,如果一个辅助函数返回一个
std::string
,shim 层将知道如何调用 JNIEnv 函数让本地方法返回一个 JavaString
给虚拟机。
我知道事情不能总是以这种方式构建,但它有一些很好的优点:
- 它将允许您编写一个 C++ 程序来直接驱动工作代码。这可以让您更快、更轻松地测试您的代码,而不必将您的 Java 应用程序操作到它正在使用您的代码进行测试的状态。
- 您将能够在调试器、
valgrind
、内存分析器等下运行您的代码,而不必在该工具下运行整个 JVM。这使得确定哪些内存可能泄漏、缓冲区溢出等变得大大容易,而不会被 JVM 内部操作引起的“噪音”所淹没。
的确,这种方法意味着垫片层没有经过测试。但由于 shim 层仅在 Java 世界和 C++ 世界之间转换对象,因此它有望非常简单,因此适合在完整 Java 应用程序的上下文中进行测试。
关于java - 如何为 Java 应用程序调试 C++ dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10575308/