Фрагменты подключаемого модуля Eclipse, специфичная для архитектуры
-
02-10-2019 - |
Вопрос
Мне нужно нацелить как Win32.x86, так и Win32.x86_64 при создании плагина RCP, в котором используется OS.GetRegoPenKey (...). Типы аргументов для метода различны для двух архитектур.
Теперь я понимаю, что нет простого способа иметь фрагмент x86 или x86_64 (в зависимости от сборки) переопределить метод в подключателе моего хоста.
Однако от эта почта Это звучит как фрагмент, например, добавить класс, который расширяет класс в хосте. А затем плагин хоста может явно использовать класс -загрузчик, чтобы найти и создавать правильный подкласс из фрагмента, включенного в сборку этой архитектуры. Как это будет выглядеть?
Решение
Основываясь на сообщении, это то, что у меня есть до сих пор (сейчас строится без ошибок для обеих архитектур, и мне просто нужно посмотреть, будет ли застроенное 64-разрядное приложение работать в 64-битных окнах!):
Используйте мастер фрагментов Eclipse, чтобы создать фрагменты x86 и x86_64. В манифестах добавлено несколько дополнительных строк вручную. Например, важные биты манифеста фрагмента x86_64.
...
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.
Добавлены фрагменты в 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;
Я должен использовать свойство архитектурной системы, чтобы выбрать, что для создания экземпляра - позже.