Charger la bibliothèque partagée par chemin à l'exécution
Je fais construire une application Java qui utilise une bibliothèque partagée écrit en C++ et compilé pour différents systèmes d'exploitation. Le problème, c'est que cette bibliothèque partagée elle-même dépend d'une bibliothèque supplémentaire, il retrouve généralement dans le cadre de la variable d'environnement (PATH, LIBRARY_PATH ou LD_LIBRARY_PATH).
J'ai peut - mais ne voulez pas à définir ces variables d'environnement. Je préfère charger les bibliothèques partagées nécessaires à partir d'un chemin d'accès donné au moment de l'exécution, comme un plugin. Et pas - je ne veux pas de starter application qui démarre un nouveau processus avec un nouvel environnement. Quelqu'un sait comment faire?
Je sais que cela doit être possible, comme l'une des bibliothèques que j'utilise est capable de charger les plugins à partir d'un chemin donné. Bien sûr, je préfère la plate-forme indépendante de code, mais si ce n'est pas possible, séparé des solutions pour Windows, Linux et MacOS serait aussi le faire.
MODIFIER
Je devrais avoir mentionné que la bibliothèque partagée j'avais souhaitez utiliser est orienté objet, ce qui signifie qu'une liaison de fonctions simples ne le fera pas.
source d'informationauteur aRestless | 2011-10-02
Vous devez vous connecter pour publier un commentaire.
De l'onu systèmes UNIX/Linux, vous pouvez utiliser
dlopen
. La question est alors de vous récupérer tous les symboles dont vous avez besoin viadlsym
Exemple Simple:
Charge la .donc, et d'exécuter function_name_to_fetch() à partir de là. Voir la page de man dlopen(1) pour plus d'.
Sur Windows, vous pouvez utiliser
LoadLibrary
et sur Linux,dlopen
. Les Api sont très similaires et peuvent charger un so/dll directement en fournissant le chemin d'accès complet. Qui fonctionne si c'est un moment de l'exécution de la dépendance (après le chargement, vous "lien" en appelantGetProcAddress
/dlsym
.)Je suis d'accord avec les autres affiches sur l'utilisation de dlopen et LoadLibrary. Le libltdl vous donne une plate-forme indépendante de l'interface de ces fonctions.
Je ne pense pas que vous pouvez faire pour elle.
La plupart des Dll avoir une sorte de fonction init() qui doit être appelée après qu'il a été chargé, et parfois des que la fonction init() a besoin de quelques paramètres et retourne des poignée de à être utilisé pour appeler la dll fonctions. Connaissez-vous la définition de la bibliothèque supplémentaire?
Ensuite, la première bibliothèque ne peut pas simplement regarder si la DLL X est dans la RAM uniquement à l'aide de son nom. Il doit peut être dans un autre répertoire ou une autre version ou version. Le système d'exploitation de reconnaître la bibliothèque si le chemin d'accès complet est le même qu'un autre est déjà chargé et il en fera part au lieu de charger une deuxième fois.
L'autre bibliothèque pouvez charger les plugins à partir d'un autre chemin, car il est écrit de ne pas dépendre sur le CHEMIN et ils sont ses propres plugins.
Avez-vous essayez de mettre à jour les variables d'environnement dans le code avant le chargement de la Dll? Qui ne dépend d'un démarreur processus.