2017-09-19 1 views
1

J'ai rencontré un comportement étrange sur l'un de nos clients en essayant de charger une librairie JNI à l'exécution.Java System.load (libName) recherche le mauvais nom de la librairie

Lorsque vous essayez de charger une bibliothèque

System.load("libtestlibrary.so") 

Je reçois un

liblibtestlibrary.so.so: cannot open shared object file: No such file or directory 

Il semble que le nom de la bibliothèque donnée est (à tort) préfixé par « lib » et suffixé avec » .donc "et ainsi notre bibliothèque ne peut être trouvée.

Ceci se produit uniquement sur une machine (AIX 6). J'ai été incapable de reproduire ce comportement sur notre propre boîtier AIX 6 en utilisant exactement le même JRE, donc je suppose que cela est causé par certains paramètres du système d'exploitation sur la machine du client.

Est-ce que quelqu'un a une idée pour désactiver cette fonction?

+2

Essayez 'System.load ("/fullpath/libtestlibrary.so ")' ou 'System.loadLibrary (" testlibrary ")'. Ce dernier combiné avec la propriété de réglage 'java.library.path' en conséquence. –

+0

Une note: utiliser l'utilitaire 'truss (1)' pour déboguer, avec l'option '-f' –

+0

Le problème n'est pas le chemin, la bibliothèque se trouve dans le répertoire courant. Le problème est la modification du nom de la bibliothèque en le préfixant avec "lib" et en le suffixant avec ".so". Je comprends que je pourrais charger la bibliothèque en utilisant 'System.load (" testlibrary ")', mais dans ce cas le code échouera sur toutes les autres plates-formes. 'System.loadLibrary (" testlibrary ")' devrait être utilisé pour les bibliothèques natives autant que je comprends la documentation. –

Répondre

0

Vous pouvez utiliser:

System.loadLibrary("libraryname"); 

Il sera bien étendu à la notation spécifique du système. Ou vous pouvez utiliser:

System.load("you_can_have_anything_you_like_here") 

En second cas, tout ce que vous devez faire est de pointer vers l'emplacement correct du fichier. Si vous recherchez un développement système croisé, vous pourriez être intéressé par l'intégration de votre code natif dans JAR. Jetez un coup d'oeil ici pour un exemple de code où la bibliothèque est prise à partir du fichier JAR

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo031

Aussi, assurez-vous que les autres bibliothèques sont disponibles dans LD_LIBRARY_PATH. Notez que java.library.path n'est valide que pour votre "première" bibliothèque native. Si votre code utilise d'autres bibliothèques partagées, vous devez soit compiler avec rpath, soit vous assurer que les bibliothèques sont visibles sur tout le système.

Une autre approche consiste à passer par stub: http://jnicookbook.owsiak.org/recipe-No-018/

Dans ce cas, vous pouvez charger la bibliothèque que vous voulez et faire ce que vous aimez (par exemple changer le code natif à la volée).