架构特定的日食插件片段
-
02-10-2019 - |
题
当构建使用OS.GetRegopenkey(...)的RCP插件时,我需要针对Win32.x86和Win32.x86_64架构。对于两个架构,该方法的参数类型是不同的。
我现在知道,没有直接的方法可以使x86或x86_64片段(取决于构建)覆盖我的主机插件中的一种方法。
但是,来自 这个帖子 听起来像是片段可以添加一个在主机中扩展类的类。然后,主机插件可以显式使用ClassLoader查找并实例从该体系结构构建中包含的片段中的正确子类实例。这会是什么样?
解决方案
基于链接到帖子,这是我到目前为止所拥有的(现在两个架构都没有错误的构建,我只需要查看构建的64位应用程序是否会在64位Windows上运行!):):):
使用Eclipse的片段插件向导创建X86和X86_64片段。清单手动添加了几行。例如,x86_64 fragment的清单的重要位:mf:
...
Bundle-SymbolicName: com.company.product.win32.x86_64;singleton:=true
Fragment-Host: com.company.product.win32;bundle-version="1.0.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.arch=x86_64))
Bundle-ClassPath: src/,.
然后,在片段中添加了子类(使用与主机插件中的超级类相同的软件包名称,但这可能不是必需的):
package com.company.product.win32;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.TCHAR;
/**
* Subclass the host's abstract OSUtilities
*/
public class OSUtilities64 extends OSUtilities {
public String getRegKeyValue (String path, String key) {
long [] phkResult = new long [1];
if (OS.RegOpenKeyEx ((long) OS.HKEY_LOCAL_MACHINE, new TCHAR(0, path, true),
0, OS.KEY_READ, phkResult) != 0) {
...
Osutilities32类也相同。
将片段添加到功能.xml中,包含主机插件:
<plugin
id="com.company.product.win32"
os="win32"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.company.product.win32.x86"
os="win32"
arch="x86"
download-size="0"
install-size="0"
version="0.0.0"
fragment="true"
unpack="false"/>
<plugin
id="com.company.product.win32.x86_64"
os="win32"
arch="x86_64"
download-size="0"
install-size="0"
version="0.0.0"
fragment="true"
unpack="false"/>
然后,主机插件可以静态加载适当的可用类:
/**
* Get class from appropriate fragment
*/
public static OSUtilities getOSUtilities() {
ClassLoader loader = OSUtilities.class.getClassLoader();
try {
Class<?> cls;
try {
cls = loader.loadClass("com.company.product.win32.OSUtilities32");
} catch (ClassNotFoundException e) {
cls = loader.loadClass("com.company.product.win32.OSUtilities64");
}
OSUtilities util = (OSUtilities) cls.newInstance();
return util;
我应该使用架构系统属性来选择该属性以稍后进行实例化。
不隶属于 StackOverflow