Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ma JVM me déteste... (assez urgent)

4 réponses
Avatar
Stéphane Zuckerman
Bonjour,

J'utilise BerkeleyDB/XML pour un projet de classe, et comme tout bon
étudiant, je m'y suis pris tard pour faire ce qu'on me demandait (càd :
ce weekend...). Je tombe sur un problème assez épineux : BDB/XML possède
tout un tas de bibliothèques compilées en C++, en plus d'une API Java.
Or, lorsque j'essaie de compiler un programme minimal avec l'API Java,
ma jvm me sort le message suivant :

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# SIGSEGV (0xb) at pc=0xa81a3ac0, pid=7616, tid=3085006528
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_02-b09 mixed mode)
# Problematic frame:
# C [libdb_java-4.3.so+0x1cac0]
Java_com_sleepycat_db_internal_db_1javaJNI_initDbEnvRef0+0x20
#
# An error report file with more information is saved as hs_err_pid7616.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#

Je fournis plus bas le source "minimal" utilisé pour obtenir cette
erreur. Le problème vient clairement d'une bibliothèque C/C++ que la JVM
ne trouve pas, mais je ne vois pas ce qu'il faut faire mis à part
positionner correctement LD_LIBRARY_PATH (ce qui a été fait, vérifié, et
revérifié). Je suis sous Linux (2.6.14).

lasher@kulgan:/dev$ java -version
java version "1.5.0_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_02-b09)
Java HotSpot(TM) Client VM (build 1.5.0_02-b09, mixed mode)


J'ai ensuite essayé de compiler sur Mac OS X.3.9, avec la JVM d'Apple,
et j'ai eu comme résultat

Lasher@Milamber [06:32:46] </Volumes/Swapping/dbxml/java>$ java
xmldb.XmlQuery
Exception in thread "main" java.lang.UnsatisfiedLinkError: no
db_java-4.3 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at
com.sleepycat.db.internal.db_javaJNI.<clinit>(db_javaJNI.java:48)
at com.sleepycat.db.internal.DbEnv.<init>(DbEnv.java:200)
at
com.sleepycat.db.EnvironmentConfig.createEnvironment(EnvironmentConfig.java:738)
at
com.sleepycat.db.EnvironmentConfig.openEnvironment(EnvironmentConfig.java:691)
at com.sleepycat.db.Environment.<init>(Environment.java:30)
at xmldb.XmlQuery.createEnv(XmlQueries.java:33)
at xmldb.XmlQuery.main(XmlQueries.java:98)


Je suis un peu désespéré, je l'avoue ...

Merci pour toute aide sur ce problème. :-)

----------8<----------------
Le code source :
package xmldb;

import java.io.*;
import com.sleepycat.dbxml.*;
import com.sleepycat.db.*;

class XmlQueries
{
private static Environment createEnv(File path2DbEnv)
// J'ai supprimé les instructions de config pour simplifier,
// mais c'est ici qu'on "règle" la façon d'accéder à la base.
return new Environment(path2DbEnv, new EnvironmentConfig());
}

// Ce sont les variables permettant d'accéder à la bdb/xml.
private static String dbPath = "/home/lasher/Java/xmldb";
private static String theContainer = "db.dbxml";
private static String
collection="collection('"+dbPath+"/"+theContainer+"')";

public static void main(String args[])
throws Throwable {

File path2DbEnv = new File(dbPath);

Environment env = null;
XmlManager theMgr = null;

if (path2DbEnv == null || ! path2DbEnv.isDirectory())
{
System.err.println("Le fichier n'est pas bon," +
" ou n'est pas un repertoire !");
System.exit(-1);
}

try {
env = createEnv(path2DbEnv);
theMgr = new XmlManager(env,new XmlManagerConfig());

} catch (Exception e) {
// On n'arrive jamais jusqu'ici, on plante avant.
}
} //End main
}

4 réponses

Avatar
Alain
de mémoire il y a aussi un parametre genre -Djava.library.path ou même le bon vieux path (ca c'est sur windows peut être)

sinon honnêtement, la lib est elle compatible avec java 1.5.x ...
a tester avec une jvm 1.4.2.x juste pour voir...


Bonjour,

J'utilise BerkeleyDB/XML pour un projet de classe, et comme tout bon ...
# An unexpected error has been detected by HotSpot Virtual Machine:
# SIGSEGV (0xb) at pc=0xa81a3ac0, pidv16, tid085006528
# Java VM: Java HotSpot(TM) Client VM (1.5.0_02-b09 mixed mode)
# Problematic frame:
# C [libdb_java-4.3.so+0x1cac0]
Java_com_sleepycat_db_internal_db_1javaJNI_initDbEnvRef0+0x20

Je fournis plus bas le source "minimal" utilisé pour obtenir cette
erreur. Le problème vient clairement d'une bibliothèque C/C++ que la JVM
ne trouve pas, mais je ne vois pas ce qu'il faut faire mis à part
positionner correctement LD_LIBRARY_PATH (ce qui a été fait, vérifié, et
revérifié). Je suis sous Linux (2.6.14).
[06:32:46] </Volumes/Swapping/dbxml/java>$ java
xmldb.XmlQuery
Exception in thread "main" java.lang.UnsatisfiedLinkError: no
db_java-4.3 in java.library.path


Avatar
Stéphane Zuckerman
de mémoire il y a aussi un parametre genre -Djava.library.path > ou même le bon vieux path (ca c'est sur windows peut être)

sinon honnêtement, la lib est elle compatible avec java 1.5.x ...
a tester avec une jvm 1.4.2.x juste pour voir...




Alors, entre temps j'ai fait quelques progrès sur Mac OS X (qui a un
système de bibliothèques dynamiques pour le moins bizarres...), et j'ai
tenté le -Djava.library.path, et ça ne marche toujours pas sur le
PC/Linux. Sur le Mac, ça n'a pas vraiment l'air non plus.

Bref, tant pis, je crois juste que je suis maudit. :-)

Merci quand même !

Stéphane

Avatar
Frederic Lachasse
"Stéphane Zuckerman" wrote in message
news:43f1133d$0$1146$
de mémoire il y a aussi un parametre genre -Djava.library.path >> ou même le bon vieux path (ca c'est sur windows peut être)

sinon honnêtement, la lib est elle compatible avec java 1.5.x ...
a tester avec une jvm 1.4.2.x juste pour voir...




Alors, entre temps j'ai fait quelques progrès sur Mac OS X (qui a un
système de bibliothèques dynamiques pour le moins bizarres...), et j'ai
tenté le -Djava.library.path, et ça ne marche toujours pas sur le
PC/Linux. Sur le Mac, ça n'a pas vraiment l'air non plus.

Bref, tant pis, je crois juste que je suis maudit. :-)


Mon expérience de JNI sous Unix, et en fait de tout utilisation de DLL (.so,
.sl ou autres selon la version d'Unix), c'est que le LD_LIBRARY_PATH (ou ce
qui sert de path selon la version d'Unix) doit absolument être initialisé
avant de lancer l'exécutable qui démarre la JVM. L'option
"-Djava.library.path=..." peut éventuellement utiliser pour trouver la
librairie, mais souvent cette librarie dépend d'autres librairies (je ne
connais pas BerkeleyDB, mais je suis sûr que la JNI ne contient pas tout le
code de la DB, c'est juste un adaptateur vers l'API C/C++). Donc il est très
probable que si la JVM n'arrive pas à charger la JNI, c'est parce que il ne
trouve pas les libraries dépendantes.

--
Frédéric Lachasse - ECP86


Avatar
Stéphane Zuckerman
Mon expérience de JNI sous Unix, et en fait de tout utilisation de DLL (.so,
.sl ou autres selon la version d'Unix), c'est que le LD_LIBRARY_PATH (ou ce
qui sert de path selon la version d'Unix) doit absolument être initialisé
avant de lancer l'exécutable qui démarre la JVM. L'option
"-Djava.library.path=..." peut éventuellement utiliser pour trouver la
librairie, mais souvent cette librarie dépend d'autres librairies (je ne
connais pas BerkeleyDB, mais je suis sûr que la JNI ne contient pas tout le
code de la DB, c'est juste un adaptateur vers l'API C/C++). Donc il est très
probable que si la JVM n'arrive pas à charger la JNI, c'est parce que il ne
trouve pas les libraries dépendantes.


Euh oui, sauf que, comme indiqué dans mon post original, j'ai bien
positionné le LD_LIBRARY_PATH. Sur mon Linux, je passe d'une exception
qui me dit que le lien n'a pu être fait à un message d'erreur m'invitant
à soumettre le fichier de log généré par la jvm de Sun sur leur site de
bug report.

Sur le Mac, LD_LIBRARY_PATH devient DYLD_LIBRARY_PATH, et à la place
d'un plantage, j'ai droit à un joli freeze de l'application. Bref, pas
beaucoup mieux.

Donc que ça ait rapport avec les bibliothèques C++ de BDB/XML est
certain, ce que je ne comprends pas, c'est pourquoi chez « les autres »
ça marche, et pas chez moi...

Merci quand même ;-)