- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
各位开发者大家好!
因为 SO 几乎总是对我的编程问题有帮助,所以我决定注册并尝试解决我最近遇到的问题。这真是一个奇怪的现象,我和我的同事都想不通。很抱歉,我无法提供工作示例,但该项目很难分解,需要特定的硬件才能正常运行。所以我会尽力解释。
我们项目的基础是一个 native 库(在本例中为 32 位 Windows C-DLL),用于通过 Java 应用程序访问特定于项目的硬件(JNA)。目的是在 Swing UI 中管理和显示硬件(通过 USB 连接)的专有文件系统。这对我们来说是一个非常常见的项目配置,因为我们在 Java 应用程序中集成了很多 native 库和驱动程序。
总结:枚举设备的单元测试工作正常。 native 库的模块分配内存并用结构填充它,每个结构都包含连接设备的信息。这不是好的做法,但由于我们对这部分没有任何影响,我们必须接受它。我在 Java/JNA 中映射了这个结构,调用 native 函数,将结构内容复制到 Java 传输类并在控制台中打印它。工作正常。
现在,如果在枚举设备时有 UI 操作处于 Activity 状态,则 native 库会因访问冲突而崩溃。即使此 UI 操作与库无关。 JNA 错误消息显示 EXCEPTION_ACCESS_VIOLATION (0xc0000005),SO 研究表明它是无效/空内存。
有没有人遇到过这样的问题?我们当然从来没有这样做过。我花了几天时间才将错误源缩小到这部分代码。当涉及 native 库时,调试并不容易。有没有可能是JVM内存并发问题?由于 native 库自行分配内存,而 JVM 对此一无所知 - 因此 JVM 会尝试在已使用的内存中为新的 Swing 组件分配内存?
代码:以下片段来 self 的单元测试,已尽可能分解。预期的顺序很明显:从根节点中删除节点,加载连接的设备并将这些设备添加为新节点。此代码因访问冲突而崩溃,但不是在 native 调用时崩溃 - 只要我访问树组件,它就会崩溃。
public void loadDevices(){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
rootNode.removeAllChildren();
rootNode.add(new LoadingNode());
tree.expandPath(new TreePath(rootNode));
}
});
final List<Device> devices = lib.loadDevices(); // wrapped native call
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
rootNode.removeAllChildren();
if(!devices.isEmpty()){
for (Device dev : devices ) {
DevNode node = new DevNode(dev);
rootNode.add(node);
}
}
}
});
}
注意:DevNode 不包含任何 native 数据,每个 native 结构的内容都被复制到 Java 传输对象。尝试移动对象数据时,GC 应该不会有问题,因为所有非托管代码都在 lib#loadDevices() 方法中本地处理。
当我完全删除对
我知道这是一个非常具体的问题,几乎没有人会感兴趣(这使得在 SO/Google 中搜索解决方案变得非常困难)。但也许我很幸运,有人已经遇到过这个问题。
好久不见
桑德
编辑:最初这段代码被包裹在一个工作线程中,导致相同的结果。这只是我的单元测试的一个片段。
编辑 2: 看来我没有说清楚或者忘了在这里提到一些重要的事情,抱歉。对树或其模型的访问不一定与 native 库有关。再看一遍代码:第一次调用 invokeLater 只是从树中删除节点。即使我删除了对 invokeLater 的第二次调用, native 库也会崩溃!
最佳答案
在我了解到这一点之前,我一直在努力使用 JTree:
在 JTree 上,不应编辑节点本身,而应使用 DefaultTreeModel 上提供的方法:
setRoot(TreeNode root)
removeNodeFromParent(MutableTreeNode node)
insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index)
编辑节点本身会(迟早会)导致奇怪的行为。
这当然是在您使用 DefaultTreeModel 和 MutableTreeNode 时。我强烈建议这样做,因为我已经看到许多错误的 TreeModel 实现。
关于java - 奇怪的现象 : Java/Swing-operations cause access violation in native library (JNA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15768011/
我正在尝试使用一个使用 JNI 的库。 我已经尝试了开发人员提供的示例应用程序,它可以工作。所以我知道这不是库中的错误。 我认为我在导入库的过程中做错了什么: 将 .so 文件复制到我的 libs 文
使用Websphere 应用程序服务器 + Wicket 1.6我的挂载 URL 遇到一些问题。 当我调用类似于以下内容的网址时:localhost:9080/danesCooking/pies/me
我有一个应用程序在 Win2k3 VM 上的 Apache Tomcat 5.5 上运行。该应用程序提供 XML,供某些电话设备使用,作为我们 IVR 基础设施的一部分。反过来,应用程序从一些 SOA
升级到雅加达给我带来了一些问题。。我正在使用以下maven插件:。并且我使用episodal编译(有库)。突然间,我面临着以下问题:。更仔细的检查发现,XJC突然生成了以下字段:。这是它以前没有产生的
Jenkins 有一个可用于自由式构建作业的 $CAUSE 变量。 如何在工作流程中访问此内容或类似内容? 我的团队在现有临时构建的电子邮件输出中使用它。我们希望在新的基于工作流的工作中继续这样做。
错误:无法完成 Gradle 执行。 原因: Could not create parent directory for lock file C:\Program Files\Android\Andr
如何确定多个浏览器 UI 事件是否由相同的基本 UI 交互引起? 例如,用户单击和事件监听器会触发“blur”和“mousedown”事件。有没有办法确定这两个事件都是由一次用户点击引起的? 最佳答案
它可以编译,但不会从 .o 文件链接到可执行文件。我已经删除了从现在到运行良好时所做的所有更改(基本上,str_to_int 中的所有内容)。 我的代码: #include #include in
关于 Java 的 InterruptedException 有一些有趣的问题和答案。 ,例如 The Cause of InterruptedException和 Handling Interrup
我使用 android 工具 “内存监视器” 来修复内存泄漏。这很有帮助。 但是,我需要澄清一下。 有时在运行该应用程序后,分配的内存为“47MB”。当与应用交互时,它会上下移动。 然后当我点击“ca
我正在调查由于堆损坏而导致的崩溃。由于这个问题很重要并且涉及分析堆栈和转储结果,因此我决定对与崩溃相关的文件进行代码审查。 坦率地说,我对堆何时可能损坏没有深入的了解。 如果您能提出可能导致堆损坏的方
假设我们有一个名为 feature-branch 的功能分支。该分支的开发人员分支获取他们的票,然后打开一个 PR 到 feature-brach。 如果发生以下情况: 开发人员A从feature-b
两个线程同时访问fileName。 Set If 0 使死锁。但如果 1 一切顺利。 那么是什么导致了这种情况? 最佳答案 确保您没有在主线程上同步调用 +[PHAssetResource asset
不幸的是,我还不是正则表达式专家,因此遇到了以下问题:假设我有一个包含多个链式异常的 Java 堆栈跟踪,我想要达到的是提取以“Caused by”开头的最后一行。 javax.servlet.Ser
我确信这是我所缺少的非常简单的东西。我使用 makeKeyAndOrderFront: 打开一个窗口,它第一次工作。当我关闭窗口并尝试再次打开它时,它退出并给出错误EXC_BAD_ACCESS。我的代
我刚刚探索了 Rank2Types 和 RankNTypes,试图熟悉它们。但我不明白为什么以下不起作用。 g :: (forall a. forall b. a -> b) -> x -> y ->
我想验证输入是否严格是由 10-16 个字符长组成的数字。根据用户输入值,我将在输入字段下方显示一条消息。问题是,当我去使用时为了帮助完成此任务,它会导致应用程序抛出异常。 我是 JSF 新手,我很难
许多内置的 Java 异常无法接受“原因”。有什么方法可以为这些异常指定原因吗? 我希望能够链接异常,就像这个 InterruptedException 示例一样: try{ //thread
我创建了一个 JSP Mysql 和 Bootstrap Crud 应用程序。当我单击“更新”按钮时,将调用函数 validation() 来更新所有字段,在成功更新后,它将重定向到另一个 JSP 页
我看到了奇怪的情况:在我的 Android 应用程序代码中使用类似这样的东西时我没有收到任何错误: @Override public void onBackPressed() { if
我是一名优秀的程序员,十分优秀!