アーキテクチャ固有のEclipseプラグインフラグメント
-
02-10-2019 - |
質問
os.getRegopenkey(...)を使用するRCPプラグインを構築する際に、Win32.x86とWin32.x86_64アーキテクチャの両方をターゲットにする必要があります。メソッドの引数のタイプは、2つのアーキテクチャで異なります。
私は、ホストプラグインのメソッドをオーバーライドするx86またはx86_64フラグメント(ビルドに応じて)を持つ簡単な方法がないことを理解しています。
しかし、から この郵便受け たとえば、フラグメントは、ホストのクラスを拡張するクラスを追加できるように聞こえます。ホストプラグインは、クラスローダーを明示的に使用して、そのアーキテクチャのビルドに含まれるフラグメントから正しいサブクラスを見つけてインスタンス化することができます。これはどのように見えますか?
解決
リンクされた投稿に基づいて、これは私がこれまでに持っているものです(両方のアーキテクチャでエラーなしでビルドします。64ビットアプリが64ビットウィンドウで実行されるかどうかを確認する必要があります!):
Eclipseのフラグメントプラグインウィザードを使用して、x86およびx86_64フラグメントを作成します。マニフェストには、手動で追加されたいくつかの追加のラインがあります。たとえば、x86_64フラグメントのマニフェストの重要なビット: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) {
...
OSUTITISITION32クラスでも同じです。
ホストプラグインを含むfeature.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;
アーキテクチャシステムのプロパティを使用して、インスタンス化するものを選択する必要があります。