目标
我目前正在使用Windows上的Netbeans平台在Netbeans中开发一个应用程序(一个跨平台的解决方案会很精彩但是如果需要的话,对于Windows来说这个问题很好)。应用程序通过JNA与本机C ++ DLL进行通信。 DLL位于指定的目录中,我无法控制或更改 - 例如 C:\ DLL 。
DLL本身会加载一些文件以便读取值等,但它使用相对路径来完成此操作。因此它需要“当前”目录为C:\ DLL。同样,这是我在这个项目中无法改变的。 DLL是我必须与之通信的(不幸的是)。
问题
对于常规JAVA应用程序,我已经在Netbeans中选择设置已启动应用程序的工作目录,如下所示:
http://i.imgur.com/3HuQKS8.png
但是在Netbeans Platform框架/模板中没有这样的选择。在大多数情况下,看起来Netbeans只是将我在“编辑器”窗格中关注的当前文件的目录设置为当前工作目录。
那我该怎么做呢?我可能能够通过位于C:\ DLL中的快捷方式运行应用程序,但是当我通过Netbeans调试应用程序时,这没有用。
我想知道如何使用当前工作目录集运行/调试此Netbeans平台应用程序。
澄清Netbeans平台 Netbeans平台是各种应用程序框架。具有基于“模块”的预定义结构,这些模块相互作用以形成完整的应用程序。整个事情都在Netbeans平台环境中托管,该环境为每个模块提供选项卡/对接窗口。很高兴开发更大的应用程序。
答案 0 :(得分:1)
我已经建议使用chdir作为@technomage(我似乎无法用他当前的帐户状态来评价他/她的评论)。
为此,我在通过JNA加载C ++ DLL之前使用了以下代码。
NativeLibrary clib = NativeLibrary.getInstance(null);
int result = clib.getFunction("_chdir").invokeInt(new Object[]{"<PATH GOES HERE>"});
来源:https://www.java.net/node/643965#comment-821128
您还可以通过查看result
变量来检查结果。如果一切顺利,应该为零。
我不确定为什么null
适用于NativeLibrary.getInstance
。文档没有具体说明这一点,我无法从源代码中收集任何内容:https://github.com/twall/jna/blob/master/src/com/sun/jna/NativeLibrary.java - 但是传递null似乎可以为您的平台提供默认的libc或等效文件。
另请注意,我必须在函数名称中添加_
(下划线)。这与在Windows上编译时函数调用如何被破坏有关。据我所知,这在其他平台上并不需要,但我现在没有能力对此进行测试。
由于我不确定我的电话是否真的有效,我先做了以下几点:
Function f = clib.getFunction("_chdir");
这将返回一个函数“pointer”f
,您可以跟踪/调试它以查看是否有有效的引用。幸运的是,在我的情况下,我所要做的就是添加下面的源链接中建议的下划线。
在调用chdir
之后,我需要访问的C ++ DLL很乐意访问相对于chdir
中指定位置的文件。