Cum pot Java webstart mai multe, dependente, biblioteci native?

Exemplu: Am două obiecte comune (același lucru ar trebui să se aplice și .dlls). Primul obiect comun este de la o bibliotecă terță parte, îl vom numi libAso. Am înfășurat câteva dintre acestea cu JNI și am creat propria mea bibliotecă, libB.so. Acum libB depinde de libA.

La pornirea web, ambele biblioteci sunt locuri în zona de lucru webstart. Codul meu Java încearcă să încarce libB. În acest moment, încărcătorul de sistem va încerca să încarce libA, care nu este în calea bibliotecii de sistem (java.library.path nu va ajuta acest lucru). Rezultatul final este că libB are o legătură nesatisfăcută și nu poate fi utilizat.

Am încercat să încărcați libA înainte de libB, dar asta încă nu funcționează. Se pare că OS vrea să facă încărcarea pentru mine. Există vreo modalitate prin care pot să fac această lucrare altfel decât compilarea statică?

0
fr hi bn

3 răspunsuri

Analiza statică s-a dovedit a fi singura modalitate de a începe web-ul cu mai multe biblioteci native dependente.

0
adăugat

Nu sunt sigur dacă acest lucru ar fi gestionat exact în același mod pentru webstart, dar am intrat în această situație într-o aplicație desktop atunci când ne ocupăm de un set de biblioteci native (dll-uri în cazul nostru).

Încărcarea libA înainte ca libB să funcționeze, cu excepția cazului în care una din aceste biblioteci are o dependență care nu este înregistrată și nu în cale. Înțelegerea mea este că, odată ce ajunge la un apel de încărcare a sistemului (adică Java a găsit biblioteca în java.library.path și îi spune acum OS-ului să o încarce) - este complet dependentă de sistemul de operare pentru a găsi librăriile dependente , deoarece în acel moment sistemul de operare încarcă biblioteca pentru proces, iar OS doar știe cum să caute în calea sistemului. Acest lucru pare greu de stabilit în cazul unei aplicații Webstart, dar există o modalitate prin care aceasta nu implică compilarea statică. S-ar putea să fiți în stare să amestecați unde sunt bibliotecile dvs. - nu sunt sigur

Dacă utilizați un clasificator personalizat, aveți posibilitatea să ignorați loadLibrary și findLibrary, astfel încât să poată localiza librăriile dvs. dintr-un borcan în clasa dvs. de cursă și, de asemenea, să îl conștientizați de dependențele bibliotecii native (adică libB depinde de libA depinde de libX, atunci când încărcați libB puteți să vă prindeți și să vă asigurați că încărcați libA în primul rând, și verificând acea notă și încărcați libX mai întâi.Apoi, sistemul de operare nu încearcă să găsească o bibliotecă care nu este în calea dvs .. Este klunky și un pic dureros , dar asigurarea că Java le găsește și le încarcă pe toate în ordinea corectă poate funcționa.

0
adăugat
Classloaders nu pot rezolva problema, deoarece OS rezolva dependențele native.
adăugat autor basszero, sursa

Ambele biblioteci native sunt ambalate într-un jar semnat care este listat ca

 

În dosarul JNLP?

0
adăugat