【问题标题】:Platform specific code in EclipseEclipse 中的平台特定代码
【发布时间】:2016-01-12 04:06:44
【问题描述】:

我们正在开发一个带有图形布局组件的 java 桌面/Eclipse RCP 应用程序。我们在 Windows 上的较新(8、8.1、10)版本上遇到了 GUI 缩放问题,似乎只能通过 win32 api 调用检索缩放因子,因此我们添加了一个小 DLL 来执行此操作并通过 JNI 调用它。在 Windows 上运行良好,在 linux/osx 上的 maven 中运行良好,因为该类从未在此处实例化。

问题是要获得缩放因子,我们需要窗口句柄,我们可以这样检索:

public float getScale(GC gc) {
  return getScale(gc.getGCData().hwnd);
}

其中GCorg.eclipse.swt.graphics.GC,以下调用是对dll 的调用。但是,在 linux 上调试时,这些行给了我一个编译错误,因为该对象没有 hwnd 变量。如何以更简洁的方式解决此问题而不会出现编译错误?

【问题讨论】:

  • 这是一个 Eclipse RCP 应用程序(有相关机制)还是只是一个 SWT 应用程序?
  • 添加了说明,它是一个 Eclipse rcp 应用程序。什么力学?我环顾了一下,但没有找到。
  • 您可以将“插件片段”与平台过滤器一起使用,以便仅在所选平台上使用。

标签: java linux eclipse swt eclipse-rcp


【解决方案1】:

您可以按照Greg 的建议使用插件片段。片段可以有一个platform filter,当当前平台与过滤器表达式不匹配时,它会阻止它被加载。

Windws 32bit 的平台过滤器如下所示:

Eclipse-PlatformFilter: (& (osgi.ws=win32) (osgi.os=win32) (osgi.arch=x86))

片段还必须指定主机包。在运行时,片段资源被合并到宿主包的类空间中

Fragment-Host: the.parent.bundle

为避免编译错误,您将在主机包中包含一个接口或抽象类,以及两个针对 Windows 和 Linux 具有不同实现的片段。

Windows 实现可以安全地访问hwnd 字段,Linux 实现可以返回一个值,指示缩放不可用/修复。

例如,主机包将有一个ScaleProvider

class abstract ScaleProvider {

  ScaleProvider getInstance() {
    String className = ScaleProvider.class.getName() + "Impl";
    try {
      Class<?> implClass = ScaleProvider.class.getClassLoader().loadClass( className );
      return ( ScaleProvider )implClass.newInstance();
    } catch( ClassNotFoundException | InstantiationException | IllegalAccessException e ) {
      throw new RuntimeException( e );
    }
  }

  abstract float getScale( Gc gc );
}

为简洁起见,实现加载器接口描述属于一种类型。 getInstance() 代码需要一个名为 ScaleProviderImpl 的类出现在同一个包中。

ScaleProviderImpl 类由与当前平台匹配的片段提供,并且会有一个类

class ScaleProviderImpl extends ScaleProvider {
  float getScale( Gc gc ) {
    // platform-specific implementation
  }
}

此示例假定始终存在匹配的特定于平台的片段。但是,如果找不到 ScaleProviderImpl,您当然可以更改 getInstance() 代码以返回默认实现。

【讨论】:

  • getName() 错过了,应该是 String className = ScaleProvider.class.getName () + "Impl"; .修复后为我工作。
  • 感谢您的提示,我已相应地编辑了答案。新的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
相关资源
最近更新 更多