13 votes

cmake find_package(JNI) ne fonctionne pas dans Ubuntu 12.04 amd64

J'utilise cmake 2.8.7 sur Ubuntu 12.04 amd64. Les composants OpenJDK JRE installés sur mon système sont les suivants :

$ sudo dpkg --list | grep jdk
openjdk-6-jre   6b27-1.12.5-0ubuntu0.12.04.1   OpenJDK Java runtime, using Hotspot JIT
openjdk-6-jre-headless   6b27-1.12.5-0ubuntu0.12.04.1   OpenJDK Java runtime, using Hotspot JIT (headless)
openjdk-6-jre-lib   6b27-1.12.5-0ubuntu0.12.04.1   OpenJDK Java runtime (architecture independent libraries)

Cependant, je n'utilise pas les composants JRE d'OpenJDK. J'ai installé manuellement Oracle Java 7 JDK dans "/usr/lib/jvm/jdk1.7.0_25" et j'ai utilisé "update-alternatives" pour faire pointer "java" vers mon JDK Oracle Java 7 installé. Je n'ai pas défini de variables d'environnement "JAVA_HOME", "JAVA_BIN", "CLASSPATH" et le JDK Oracle Java 7 installé manuellement semble fonctionner correctement dans Eclipse 4.3.

Le problème est que lorsque j'utilise "find_package(JNI)" dans cmake et que j'utilise la fonction "message()" pour afficher les variables JNI, j'obtiens le résultat suivant :

Could NOT find JNI (missing:  JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) 
JNI_FOUND = FALSE
JNI_LIBRARIES = /usr/lib/jvm/java-6-openjdk/jre/lib/amd64/libjawt.so;/usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server/libjvm.so
JAVA_INCLUDE_PATH = JAVA_INCLUDE_PATH-NOTFOUND
JAVA_INCLUDE_PATH2 = JAVA_INCLUDE_PATH2-NOTFOUND
JAVA_AWT_INCLUDE_PATH = JAVA_AWT_INCLUDE_PATH-NOTFOUND
JAVA_JVM_LIBRARY = /usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server/libjvm.so
JAVA_AWT_LIBRARY = /usr/lib/jvm/java-6-openjdk/jre/lib/amd64/libjawt.so
JNI_INCLUDE_DIRS = JAVA_INCLUDE_PATH-NOTFOUND;JAVA_INCLUDE_PATH2-NOTFOUND;JAVA_AWT_INCLUDE_PATH-NOTFOUND

Le "find_package(JNI)" semble pouvoir trouver certains des composants Java liés à l'OpenJDK JRE et ne peut pas trouver mes composants actuels Oracle Java 7 JDK pointés par "update-alternatives".

Je veux savoir s'il y a un bogue dans le fichier "FindJNI.cmake" et ce que j'ai manqué dans la configuration du JDK Oracle Java 7 pour que cmake "find_package(JNI)" puisse fonctionner correctement.

Merci pour toute suggestion.

28voto

emchristiansen Points 1090

Vous pouvez modifier manuellement FindJNI.cmake pour l'aider à trouver votre JDK installé. Voir ce gist :

https://gist.github.com/emchristiansen/6845954

C'est une honte que ce script n'ait pas été mis à jour, mais peut-être pas une surprise, étant donné que CMake est un tel désastre.

EDIT : Une solution plus simple consiste à définir les paramètres suivants JAVA_HOME correctement. Avec OpenJDK 7 installé, je l'ai configuré avec :

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

4voto

Si vous avez oracle jdk 7 installé sur votre système, comme c'était mon cas, vous pourriez rencontrer des problèmes lors de la construction d'opencv. Pour résoudre ces problèmes, j'ai dû modifier le fichier /usr/share/cmake-2.8/Modules/FindJNI.cmake. Dans ce fichier, j'ai commenté les lignes avec des références à openjdk et default et ajouté des références à oracle jdk 7 comme montré ci-dessous.

JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
  ${_JAVA_HOME}/jre/lib/{libarch}
  ${_JAVA_HOME}/jre/lib
  ${_JAVA_HOME}/lib
  ${_JAVA_HOME}
  /usr/lib
  /usr/local/lib
  /usr/lib/jvm/java/lib
  /usr/lib/java/jre/lib/{libarch}
  /usr/lib/jvm/jre/lib/{libarch}
  /usr/local/lib/java/jre/lib/{libarch}
  /usr/local/share/java/jre/lib/{libarch}
  /usr/lib/j2sdk1.4-sun/jre/lib/{libarch}
  /usr/lib/j2sdk1.5-sun/jre/lib/{libarch}
  /opt/sun-jdk-1.5.0.04/jre/lib/{libarch}
  /usr/lib/jvm/java-6-sun/jre/lib/{libarch}
  /usr/lib/jvm/java-1.5.0-sun/jre/lib/{libarch}
  /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/{libarch}       # can this one be removed according to #8821 ? Alex
  #/usr/lib/jvm/java-6-openjdk/jre/lib/{libarch}        # Commented by Atul
  #/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/{libarch}        # fedora
  # Debian specific paths for default JVM
  #/usr/lib/jvm/default-java/jre/lib/{libarch}        # Commented by Atul
  #/usr/lib/jvm/default-java/jre/lib          # Commented by Atul
  #/usr/lib/jvm/default-java/lib              # Commented by Atul
  # OpenBSD specific paths for default JVM
  /usr/local/jdk-1.7.0/jre/lib/{libarch}
  /usr/local/jre-1.7.0/lib/{libarch}
  /usr/local/jdk-1.6.0/jre/lib/{libarch}
  /usr/local/jre-1.6.0/lib/{libarch}
  /usr/lib/jvm/java-7-oracle/jre/lib/{libarch} # This is added Atul
  )

et dans la section où le script cherche la bibliothèque include...

set(JAVA_AWT_INCLUDE_DIRECTORIES
  "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/include"
  "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/include"
  "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/include"
  ${_JAVA_HOME}/include
  /usr/include
  /usr/local/include
  /usr/lib/java/include
  /usr/local/lib/java/include
  /usr/lib/jvm/java/include
  /usr/lib/jvm/java-6-sun/include
  /usr/lib/jvm/java-1.5.0-sun/include
  /usr/lib/jvm/java-6-sun-1.6.0.00/include       # can this one be removed according to #8821 ? Alex
  #/usr/lib/jvm/java-6-openjdk/include
  /usr/local/share/java/include
  /usr/lib/j2sdk1.4-sun/include
  /usr/lib/j2sdk1.5-sun/include
  /opt/sun-jdk-1.5.0.04/include
  # Debian specific path for default JVM
  #/usr/lib/jvm/default-java/include
  # OpenBSD specific path for default JVM
  /usr/local/jdk-1.7.0/include
  /usr/local/jdk-1.6.0/include
  /usr/lib/jvm/java-7-oracle/include
  )

Puis j'ai suivi les instructions exactes pour construire l'openCV pour Android.

J'ai dû mettre en commentaire les lignes relatives à openjdk et default, car elles étaient en conflit avec les installations d'oracle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X