Boas tou aqui com 1 pequeno problema, tou a começar com swt e no windows para alem do swt.jar é preciso tambem um sw-win32-3232.dll, que tem de ser adicionado ao java.library.path, o problema é que nao consigo adicionar, já tentei das seguintes formas.
String libpath = System.getProperty("java.library.path");
ibpath = libpath+"C:\\swt\\;";
System.setProperty("java.library.path",libpath);
O retorno este codigo adiciona o path C:\swt\ ao java.library.path, mas no entanto ao executar o programa ele desvolve o erro de que nao encontra a lib no java.library.path :S, tambem ja usei o System.load() e System.loadLibrary() mas nada :S tou a desesperar como meto isto a funcionar ??
Você não pode alterar o “java.library.path” em tempo de execução.
O que você pode fazer é alterar o PATH do programa a ser iniciado, já que “java.library.path” é mais ou menos parecido com o PATH. Isso você pode fazer escrevendo um script (arquivo .bat ou .cmd) para iniciar seu programa. Isso pode ser feito como:
setlocal
PATH=c:\swt;%PATH%
java -jar SeuPrograma.jar
endlocal
No caso do Linux, creio que você teria de alterar a variável de ambiente LD_LIBRARY_PATH, mas não tenho certeza se alterar essa variável ajudaria.
Mas eu queria tornar o sistema autonomo, bastando apenas correr o programa sem ter de copiar dlls nem nada.
Fazendo apenas java Prog
Quando você trabalha com SWT, tem de ter um programa de instalação para dispor as DLLs (ou arquivos .SO no caso do Linux) nos locais corretos. Deve haver um tutorial no site do Eclipse ensinando onde e como copiar as tais DLLs para evitar esses problemas desagradáveis.
Uma forma um pouco “grotesca” de fazer isso é ter um programa Java que inicia outro programa Java, este com o PATH corrigido. Isso deve ser possível, mas como você sabe, gasta um monte de memória.
no site do swt diz para compilar com Djava.library.path=…
Mas isso depois vai dar uma grande confusao.
Já pensei em tambem “sacar” o endereço já definido no path e mandar fazer copy do dll para lá mas depois pode dar problemas com premições principlamente em linux.
Tou agora a pensar em fazer uma class que altere o path e depois crio um objecto dessa class será que isso funciona ? ou vai dar no mesmo ?
Coloque o seguinte código
try {
Class clazz = ClassLoader.class;
Field field = clazz.getDeclaredField("sys_paths");
boolean accessible = field.isAccessible();
if (!accessible)
field.setAccessible(true);
Object original = field.get(clazz);
field.set(clazz, null);
try {
System.setProperty("java.library.path", System.getProperty("java.library.path") + ";" + new File("").getAbsolutePath() + File.separator + "lib");
System.loadLibrary("jogl");
}
finally {
field.set(clazz, original);
field.setAccessible(accessible);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Estava tendo o mesmo problema, e consegui carregar o componente dinamicamente utilizando a solução acima. Muito boa, obrigado!
[quote=arec_metafora]Coloque o seguinte código
try {
Class clazz = ClassLoader.class;
Field field = clazz.getDeclaredField("sys_paths");
boolean accessible = field.isAccessible();
if (!accessible)
field.setAccessible(true);
Object original = field.get(clazz);
field.set(clazz, null);
try {
System.setProperty("java.library.path", System.getProperty("java.library.path") + ";" + new File("").getAbsolutePath() + File.separator + "lib");
System.loadLibrary("jogl");
}
finally {
field.set(clazz, original);
field.setAccessible(accessible);
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
[/quote]