首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Eclipse中特定于平台的代码

Eclipse中特定于平台的代码
EN

Stack Overflow用户
提问于 2015-10-14 07:21:33
回答 1查看 431关注 0票数 3

我们正在开发一个带有图形布局组件的java桌面/Eclipse应用程序。我们在windows上新版本(8、8.1、10)上遇到了GUI扩展问题,似乎只有通过win32 api调用才能检索缩放因子,所以我们添加了一个小的DLL来完成这个任务,并通过JNI调用它。在windows上工作很好,在linux/osx上的maven中工作得很好,因为该类从未在那里实例化过。

问题是,要获得缩放因子,我们需要窗口句柄,我们检索如下:

代码语言:javascript
运行
复制
public float getScale(GC gc) {
  return getScale(gc.getGCData().hwnd);
}

其中GC是一个org.eclipse.swt.graphics.GC,下面的调用是对dll的调用。但是,在linux上调试时,这几行会给我一个编译错误,因为该对象没有hwnd变量。如何在没有编译错误的情况下以更干净的方式解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-14 09:16:36

您可以使用插件片段,如格雷格所建议的。一个片段可以有一个平台过滤器,当当前平台与过滤器表达式不匹配时,就无法加载它。

用于Windws 32位的平台过滤器如下所示:

代码语言:javascript
运行
复制
Eclipse-PlatformFilter: (& (osgi.ws=win32) (osgi.os=win32) (osgi.arch=x86))

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

代码语言:javascript
运行
复制
Fragment-Host: the.parent.bundle

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

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

例如,主机包将有一个ScaleProvider

代码语言:javascript
运行
复制
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类由与当前平台匹配的片段提供,并具有一个类。

代码语言:javascript
运行
复制
class ScaleProviderImpl extends ScaleProvider {
  float getScale( Gc gc ) {
    // platform-specific implementation
  }
}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33119058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档