Separa DLL e chiamata nativa in diversi plugin
-
19-08-2019 - |
Domanda
Voglio separare alcune DLL dalle classi JNI native associate.
Plugin:
- Nel plugin A vengono inserite le dll e caricato quando viene caricato il plug-in.
- In plugin B (dipende da A) il JNI vengono posizionate le classi che includono il il metodo nativo richiede le DLL in A.
In fase di esecuzione ottengo un UnsatisfiedLinkError perché non è possibile trovare la classe JNI. Provo ad aggiornare la logica del classloader aggiornando i file MANIFEST:
Plugin A:
Eclipse-BuddyPolicy: registered
Plugin B:
Eclipse-RegisterBuddy: A
Ma anche questo non funziona. Conosci una soluzione?
EDIT:
MANIFEST A:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %plugin.name
Bundle-SymbolicName: xxx ;singleton:=true
Bundle-Version: 1.0.0
Bundle-Activator: xxx.Plugin
Bundle-Vendor: xxx
Bundle-Localization: plugin
Bundle-NativeCode: native/dll/x1.dll;
native/dll/x2.dll;
native/dll/x3.dll;
native/dll/x4.dll;
native/dll/x5.dll;
native/dll/x76.dll;
native/dll/x.dll;
native/dll/x7.dll;osname = win32; processor = x86
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.ui,
org.apache.commons.logging
Bundle-ClassPath: .
Eclipse-AutoStart: true
Eclipse-LazyStart: true
Bundle-ActivationPolicy: lazy
Eclipse-BuddyPolicy: registered
Export-Package: xxx
MANIFEST B:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %plugin.name
Bundle-SymbolicName: xxx;singleton:=true
Bundle-Version: 2.1.16
Bundle-Vendor: xxx
Bundle-Localization: plugin
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.ui,
org.apache.commons.lang,
org.apache.commons.logging,
A
Export-Package: xxx
Bundle-ClassPath: .
Bundle-Activator: xxx
Eclipse-RegisterBuddy: A
Eclipse-AutoStart: true
Eclipse-LazyStart: true
Bundle-ActivationPolicy: lazy
Soluzione
Il mio suggerimento immediato è di trasformare il plug-in B in un frammento per il plug-in A anziché in un plug-in separato, che eliminerebbe i problemi.
Detto questo, penso che tu abbia cambiato i tuoi manifest; il plugin B che sta tentando di eseguire le chiamate JNI dovrebbe avere Eclipse-BuddyPolicy: registrato
e il plugin A dovrebbe dipendere e registrarsi con il plugin B.
Detto questo, dopo aver letto i documenti di buddyloading , non sono sicuro che la politica di buddyloading funziona per file di classe non Java.