[Java] JNI dynamisch lib file laden onder verschillende OSen

Pagina: 1
Acties:

  • k0ewl
  • Registratie: December 2003
  • Laatst online: 13-11-2025
Ik gebruik een packages die gebruikt maakt van JNI om bijvoorbeeld de comport aan te spreken. Deze doet dat door middel van dll file’s onder windows en so file’s onder linux. Nu wil ik graag een packages maken die afhankelijk van het OS de juist dll file’s of so file’s laad.

Nu ben ik al wel een stukje opweg met het laden van de lib file’s die nodig zijn om de hardware te kunnen aanspreken. Met -Djava.library.path=”path” kan je het path opgeven waarin de VM naar de lib file’s moet zoeken en met System.loadLibrary(name) de juiste lib. laad. Dit heb ik goed aan het werk. Maar als ik nu een jar file maak en deze start met java -Djava.library.path=" path " -jar "myapp.jar" dan zeg de VM dat hij de lib file’s niet kan vinden. Ik zou graag willen dat hij ook in de jar file zelf naar de lib file’s zoekt. Weet iemand hoe dat mogelijk is.

Wat ik eigenlijk wil bereiken is dat mijn app. Gestart wordt en dat hij automatisch de juiste lib file’s laad die bij het OS horen. Wil dus een packages met daarin de werkelijke app. En de folder waarin de verschillende lib file’s te vinden zijn. De stucuur zou er als volgt moeten uitzien in de jar file’s:
> projectnaam folder // met werkelijke code van app.
> lib folder // met een sub indeling voor de OS’s met hun lib file’s

> lib\windows // lib file’s voor windows

> lib\linux // een sub indeling lib file’s voor linux
> lib\linux\i686\ // lib file’s voor i686 linux
> lib\linux\x86_64\ // lib file’s voor x86_64 linux

> lib\solaris// lib file’s voor solaris

> lib\mac_os_x// lib file’s voor mac_os_x

Voor andere OSén zou in de toekomst ook een sub indeling gemaakt kunnen worden in een 32 bits en een 64 bits systeem.

Op een of andere manier wou ik dus dynamisch het path willen aanpassen waar de app. zoekt naar de lib file die ik wil laden. Dit alles zou dan wel moeten gebeuren in de jar file. Nu weet ik niet helemaal zeker of dat wel mogelijk is, als het niet mogelijk is dan zou ik een lib. folder willen aanmaken in de zelfde folder waar de jar te vinden is. De app. moet dan nog wel dynamisch het path kunnen aanpassen waar de juiste lib file’s te vinden zijn.

Heeft iemand ideeën hoe ik dat alles het beste kan aanpakken, misschien zijn er wel opmerkingen dat ik het niet handig doe. Ik ben benieuwt naar de reacties.

A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Eclipse heeft dat gedaan met de libraries voor SWT. Misschien dat je daar even in de source kan koekeloeren.

  • Neptunus
  • Registratie: Januari 2001
  • Laatst online: 13-11-2025
Gert schreef op zondag 09 april 2006 @ 23:56:
Eclipse heeft dat gedaan met de libraries voor SWT. Misschien dat je daar even in de source kan koekeloeren.
Ik heb even gekeken naar code van SWT maar zie om eerlijk te zeggen door de bomen het bos niet meer!

Verwijderd

In JNI kun je zowiezo de extensie van je lib weglaten, dus het verschil tussen .dll en .so etc. wordt al door Java zelf gemaakt. Als je dan ook verschil wilt aanbrengen voor OS versies/distros, dan kun je dat denk ik het beste in de dll of so zelf doen, eventueel door een andere library dynamisch te laden/linken (volgens mij doet swt iets soortgelijks). Dat zou denk ik de mooiste oplossing zijn, maar het makkelijkste is denk ik om gewoon verschillende distributies van je app te maken met daarbij de geschikte lib bijgeleverd.

Je libs in de jar stoppen zou ook een optie zijn, maar dan zul je ze voor de System.loadLibrary call uit de jar moeten halen en ergens gewoon op de schijf moeten zetten, want volgens mij wordt het direct laden van libs uit de jar niet ondersteunt. Misschien is dit trouwens wel een mooie oplossing, om in het static block waarin je de System.loadLibrary functie aanroept eerst de correcte .dll/.so file te extracten uit de jar en in de current dir van je app te plaatsen en dan pas die functie aan te roepen. Als dit werkt zoals ik me voorstel, zou je zo de controle hebben over welke lib er precies wordt ingeladen.

[ Voor 1% gewijzigd door Verwijderd op 10-04-2006 11:02 . Reden: Zpelling en coherentie ;) ]