1# Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2# file Copyright.txt or https://cmake.org/licensing for details. 3 4#[=======================================================================[.rst: 5FindJNI 6------- 7 8Find Java Native Interface (JNI) libraries. 9 10JNI enables Java code running in a Java Virtual Machine (JVM) to call 11and be called by native applications and libraries written in other 12languages such as C, C++. 13 14This module finds if Java is installed and determines where the 15include files and libraries are. It also determines what the name of 16the library is. The caller may set variable ``JAVA_HOME`` to specify a 17Java installation prefix explicitly. 18 19Result Variables 20^^^^^^^^^^^^^^^^ 21 22This module sets the following result variables: 23 24``JNI_INCLUDE_DIRS`` 25 the include dirs to use 26``JNI_LIBRARIES`` 27 the libraries to use (JAWT and JVM) 28``JNI_FOUND`` 29 TRUE if JNI headers and libraries were found. 30 31Cache Variables 32^^^^^^^^^^^^^^^ 33 34The following cache variables are also available to set or use: 35 36``JAVA_AWT_LIBRARY`` 37 the path to the Java AWT Native Interface (JAWT) library 38``JAVA_JVM_LIBRARY`` 39 the path to the Java Virtual Machine (JVM) library 40``JAVA_INCLUDE_PATH`` 41 the include path to jni.h 42``JAVA_INCLUDE_PATH2`` 43 the include path to jni_md.h and jniport.h 44#]=======================================================================] 45 46# Expand {libarch} occurrences to java_libarch subdirectory(-ies) and set ${_var} 47macro(java_append_library_directories _var) 48 # Determine java arch-specific library subdir 49 # Mostly based on openjdk/jdk/make/common/shared/Platform.gmk as of openjdk 50 # 1.6.0_18 + icedtea patches. However, it would be much better to base the 51 # guess on the first part of the GNU config.guess platform triplet. 52 if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") 53 if(CMAKE_LIBRARY_ARCHITECTURE STREQUAL "x86_64-linux-gnux32") 54 set(_java_libarch "x32" "amd64" "i386") 55 else() 56 set(_java_libarch "amd64" "i386") 57 endif() 58 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") 59 set(_java_libarch "i386") 60 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^alpha") 61 set(_java_libarch "alpha") 62 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") 63 # Subdir is "arm" for both big-endian (arm) and little-endian (armel). 64 set(_java_libarch "arm" "aarch32") 65 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") 66 # mips* machines are bi-endian mostly so processor does not tell 67 # endianness of the underlying system. 68 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" 69 "mips" "mipsel" "mipseb" "mipsr6" "mipsr6el" 70 "mips64" "mips64el" "mips64r6" "mips64r6el" 71 "mipsn32" "mipsn32el" "mipsn32r6" "mipsn32r6el") 72 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le") 73 set(_java_libarch "ppc64" "ppc64le") 74 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64") 75 set(_java_libarch "ppc64" "ppc") 76 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") 77 set(_java_libarch "ppc" "ppc64") 78 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc") 79 # Both flavours can run on the same processor 80 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "sparc" "sparcv9") 81 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(parisc|hppa)") 82 set(_java_libarch "parisc" "parisc64") 83 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390") 84 # s390 binaries can run on s390x machines 85 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "s390" "s390x") 86 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sh") 87 set(_java_libarch "sh") 88 else() 89 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}") 90 endif() 91 92 # Append default list architectures if CMAKE_SYSTEM_PROCESSOR was empty or 93 # system is non-Linux (where the code above has not been well tested) 94 if(NOT _java_libarch OR NOT (CMAKE_SYSTEM_NAME MATCHES "Linux")) 95 list(APPEND _java_libarch "i386" "amd64" "ppc") 96 endif() 97 98 # Sometimes ${CMAKE_SYSTEM_PROCESSOR} is added to the list to prefer 99 # current value to a hardcoded list. Remove possible duplicates. 100 list(REMOVE_DUPLICATES _java_libarch) 101 102 foreach(_path ${ARGN}) 103 if(_path MATCHES "{libarch}") 104 foreach(_libarch ${_java_libarch}) 105 string(REPLACE "{libarch}" "${_libarch}" _newpath "${_path}") 106 if(EXISTS ${_newpath}) 107 list(APPEND ${_var} "${_newpath}") 108 endif() 109 endforeach() 110 else() 111 if(EXISTS ${_path}) 112 list(APPEND ${_var} "${_path}") 113 endif() 114 endif() 115 endforeach() 116endmacro() 117 118include(CMakeFindJavaCommon) 119 120# Save CMAKE_FIND_FRAMEWORK 121if(DEFINED CMAKE_FIND_FRAMEWORK) 122 set(_JNI_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) 123else() 124 unset(_JNI_CMAKE_FIND_FRAMEWORK) 125endif() 126 127if(_JAVA_HOME_EXPLICIT) 128 set(CMAKE_FIND_FRAMEWORK NEVER) 129endif() 130 131set(JAVA_AWT_LIBRARY_DIRECTORIES) 132if(_JAVA_HOME) 133 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES 134 ${_JAVA_HOME}/jre/lib/{libarch} 135 ${_JAVA_HOME}/jre/lib 136 ${_JAVA_HOME}/lib/{libarch} 137 ${_JAVA_HOME}/lib 138 ${_JAVA_HOME} 139 ) 140endif() 141 142if (WIN32) 143 set (_JNI_HINTS) 144 execute_process(COMMAND REG QUERY HKLM\\SOFTWARE\\JavaSoft\\JDK /f "." /k 145 RESULT_VARIABLE _JNI_RESULT 146 OUTPUT_VARIABLE _JNI_VERSIONS 147 ERROR_QUIET) 148 if (NOT _JNI_RESULT) 149 string (REGEX MATCHALL "HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\JavaSoft\\\\JDK\\\\[0-9.]+" _JNI_VERSIONS "${_JNI_VERSIONS}") 150 if (_JNI_VERSIONS) 151 # sort versions. Most recent first 152 ## handle version 9 apart from other versions to get correct ordering 153 set (_JNI_V9 ${_JNI_VERSIONS}) 154 list (FILTER _JNI_VERSIONS EXCLUDE REGEX "JDK\\\\9") 155 list (SORT _JNI_VERSIONS) 156 list (REVERSE _JNI_VERSIONS) 157 list (FILTER _JNI_V9 INCLUDE REGEX "JDK\\\\9") 158 list (SORT _JNI_V9) 159 list (REVERSE _JNI_V9) 160 list (APPEND _JNI_VERSIONS ${_JNI_V9}) 161 foreach (_JNI_HINT IN LISTS _JNI_VERSIONS) 162 list(APPEND _JNI_HINTS "[${_JNI_HINT};JavaHome]") 163 endforeach() 164 endif() 165 endif() 166 167 foreach (_JNI_HINT IN LISTS _JNI_HINTS) 168 list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${_JNI_HINT}/lib") 169 endforeach() 170 171 get_filename_component(java_install_version 172 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit;CurrentVersion]" NAME) 173 174 list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES 175 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\11;JavaHome]/lib" 176 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\10;JavaHome]/lib" 177 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/lib" 178 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/lib" 179 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/lib" 180 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/lib" 181 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/lib" 182 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/lib" 183 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/lib" 184 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/lib" 185 ) 186endif() 187 188JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES 189 /usr/lib/jvm/java/lib 190 /usr/lib/java/jre/lib/{libarch} 191 /usr/lib/jvm/jre/lib/{libarch} 192 /usr/local/lib/java/jre/lib/{libarch} 193 /usr/local/share/java/jre/lib/{libarch} 194 # Debian specific paths for default JVM 195 /usr/lib/jvm/default-java/jre/lib/{libarch} 196 /usr/lib/jvm/default-java/jre/lib 197 /usr/lib/jvm/default-java/lib 198 # Arch Linux specific paths for default JVM 199 /usr/lib/jvm/default/jre/lib/{libarch} 200 /usr/lib/jvm/default/lib/{libarch} 201 # SuSE specific paths for default JVM 202 /usr/lib64/jvm/java/jre/lib/{libarch} 203 /usr/lib64/jvm/jre/lib/{libarch} 204 /usr/lib/jvm/java-11-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 18.04 LTS 205 /usr/lib/jvm/java-11-oracle/lib/{libarch} 206 /usr/lib/jvm/java-10-openjdk-{libarch}/jre/lib/{libarch} 207 /usr/lib/jvm/java-10-oracle/lib/{libarch} 208 /usr/lib/jvm/java-9-openjdk-{libarch}/jre/lib/{libarch} 209 /usr/lib/jvm/java-9-oracle/lib/{libarch} 210 /usr/lib/jvm/java-8-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 15.10 211 /usr/lib/jvm/java-8-oracle/lib/{libarch} 212 # Ubuntu specific paths for default JVM 213 /usr/lib/jvm/java-7-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 15.10 214 /usr/lib/jvm/java-7-oracle/lib/{libarch} 215 /usr/lib/jvm/java-6-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 15.10 216 /usr/lib/jvm/java-6-oracle/lib/{libarch} 217 /usr/lib/jvm/java-6-sun/jre/lib/{libarch} 218 /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/{libarch} # can this one be removed according to #8821 ? Alex 219 /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/{libarch} # fedora 220 /usr/lib/jvm/java-6-openjdk/jre/lib/{libarch} 221 # OpenBSD specific paths for default JVM 222 /usr/local/jdk-1.8.0/jre/lib/{libarch} 223 /usr/local/jre-1.8.0/lib/{libarch} 224 /usr/local/jdk-1.7.0/jre/lib/{libarch} 225 /usr/local/jre-1.7.0/lib/{libarch} 226 /usr/local/jdk-1.6.0/jre/lib/{libarch} 227 /usr/local/jre-1.6.0/lib/{libarch} 228 ) 229 230set(JAVA_JVM_LIBRARY_DIRECTORIES) 231foreach(dir ${JAVA_AWT_LIBRARY_DIRECTORIES}) 232 list(APPEND JAVA_JVM_LIBRARY_DIRECTORIES 233 "${dir}" 234 "${dir}/client" 235 "${dir}/server" 236 # IBM SDK, Java Technology Edition, specific paths 237 "${dir}/j9vm" 238 "${dir}/default" 239 ) 240endforeach() 241 242set(JAVA_AWT_INCLUDE_DIRECTORIES) 243if(_JAVA_HOME) 244 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES ${_JAVA_HOME}/include) 245endif() 246if (WIN32) 247 foreach (_JNI_HINT IN LISTS _JNI_HINTS) 248 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${_JNI_HINT}/include") 249 endforeach() 250 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES 251 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\11;JavaHome]/include" 252 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\10;JavaHome]/include" 253 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/include" 254 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/include" 255 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/include" 256 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/include" 257 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/include" 258 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/include" 259 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/include" 260 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/include" 261 ) 262endif() 263 264JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_INCLUDE_DIRECTORIES 265 /usr/lib/java/include 266 /usr/local/lib/java/include 267 /usr/lib/jvm/java/include 268 /usr/lib/jvm/java-11-openjdk-{libarch}/include 269 /usr/lib/jvm/java-11-oracle/include 270 /usr/lib/jvm/java-10-openjdk-{libarch}/include 271 /usr/lib/jvm/java-10-oracle/include 272 /usr/lib/jvm/java-9-openjdk-{libarch}/include 273 /usr/lib/jvm/java-9-oracle/include 274 /usr/lib/jvm/java-8-openjdk-{libarch}/include 275 /usr/lib/jvm/java-8-oracle/include 276 /usr/lib/jvm/java-7-openjdk-{libarch}/include 277 /usr/lib/jvm/java-7-oracle/include 278 /usr/lib/jvm/java-6-openjdk-{libarch}/include 279 /usr/lib/jvm/java-6-openjdk/include 280 /usr/lib/jvm/java-6-oracle/include 281 /usr/lib/jvm/java-6-sun/include 282 /usr/local/share/java/include 283 # Debian specific path for default JVM 284 /usr/lib/jvm/default-java/include 285 # Arch specific path for default JVM 286 /usr/lib/jvm/default/include 287 # OpenBSD specific path for default JVM 288 /usr/local/jdk-1.8.0/include 289 /usr/local/jdk-1.7.0/include 290 /usr/local/jdk-1.6.0/include 291 # SuSE specific paths for default JVM 292 /usr/lib64/jvm/java/include 293 ) 294 295foreach(JAVA_PROG "${JAVA_RUNTIME}" "${JAVA_COMPILE}" "${JAVA_ARCHIVE}") 296 get_filename_component(jpath "${JAVA_PROG}" PATH) 297 foreach(JAVA_INC_PATH ../include ../java/include ../share/java/include) 298 if(EXISTS ${jpath}/${JAVA_INC_PATH}) 299 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${jpath}/${JAVA_INC_PATH}") 300 endif() 301 endforeach() 302 foreach(JAVA_LIB_PATH 303 ../lib ../jre/lib ../jre/lib/i386 304 ../java/lib ../java/jre/lib ../java/jre/lib/i386 305 ../share/java/lib ../share/java/jre/lib ../share/java/jre/lib/i386) 306 if(EXISTS ${jpath}/${JAVA_LIB_PATH}) 307 list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${jpath}/${JAVA_LIB_PATH}") 308 endif() 309 endforeach() 310endforeach() 311 312if(APPLE) 313 if(CMAKE_FIND_FRAMEWORK STREQUAL "ONLY") 314 set(_JNI_SEARCHES FRAMEWORK) 315 elseif(CMAKE_FIND_FRAMEWORK STREQUAL "NEVER") 316 set(_JNI_SEARCHES NORMAL) 317 elseif(CMAKE_FIND_FRAMEWORK STREQUAL "LAST") 318 set(_JNI_SEARCHES NORMAL FRAMEWORK) 319 else() 320 set(_JNI_SEARCHES FRAMEWORK NORMAL) 321 endif() 322 set(_JNI_FRAMEWORK_JVM NAMES JavaVM) 323 set(_JNI_FRAMEWORK_JAWT "${_JNI_FRAMEWORK_JVM}") 324else() 325 set(_JNI_SEARCHES NORMAL) 326endif() 327 328set(_JNI_NORMAL_JVM 329 NAMES jvm 330 PATHS ${JAVA_JVM_LIBRARY_DIRECTORIES} 331 ) 332 333set(_JNI_NORMAL_JAWT 334 NAMES jawt 335 PATHS ${JAVA_AWT_LIBRARY_DIRECTORIES} 336 ) 337 338foreach(search ${_JNI_SEARCHES}) 339 find_library(JAVA_JVM_LIBRARY ${_JNI_${search}_JVM}) 340 find_library(JAVA_AWT_LIBRARY ${_JNI_${search}_JAWT}) 341 if(JAVA_JVM_LIBRARY) 342 break() 343 endif() 344endforeach() 345unset(_JNI_SEARCHES) 346unset(_JNI_FRAMEWORK_JVM) 347unset(_JNI_FRAMEWORK_JAWT) 348unset(_JNI_NORMAL_JVM) 349unset(_JNI_NORMAL_JAWT) 350 351# Find headers matching the library. 352if("${JAVA_JVM_LIBRARY};${JAVA_AWT_LIBRARY};" MATCHES "(/JavaVM.framework|-framework JavaVM);") 353 set(CMAKE_FIND_FRAMEWORK ONLY) 354else() 355 set(CMAKE_FIND_FRAMEWORK NEVER) 356endif() 357 358# add in the include path 359find_path(JAVA_INCLUDE_PATH jni.h 360 ${JAVA_AWT_INCLUDE_DIRECTORIES} 361) 362 363find_path(JAVA_INCLUDE_PATH2 NAMES jni_md.h jniport.h 364 PATHS 365 ${JAVA_INCLUDE_PATH} 366 ${JAVA_INCLUDE_PATH}/darwin 367 ${JAVA_INCLUDE_PATH}/win32 368 ${JAVA_INCLUDE_PATH}/linux 369 ${JAVA_INCLUDE_PATH}/freebsd 370 ${JAVA_INCLUDE_PATH}/openbsd 371 ${JAVA_INCLUDE_PATH}/solaris 372 ${JAVA_INCLUDE_PATH}/hp-ux 373 ${JAVA_INCLUDE_PATH}/alpha 374 ${JAVA_INCLUDE_PATH}/aix 375) 376 377# Restore CMAKE_FIND_FRAMEWORK 378if(DEFINED _JNI_CMAKE_FIND_FRAMEWORK) 379 set(CMAKE_FIND_FRAMEWORK ${_JNI_CMAKE_FIND_FRAMEWORK}) 380 unset(_JNI_CMAKE_FIND_FRAMEWORK) 381else() 382 unset(CMAKE_FIND_FRAMEWORK) 383endif() 384 385include(FindPackageHandleStandardArgs) 386FIND_PACKAGE_HANDLE_STANDARD_ARGS(JNI DEFAULT_MSG JAVA_AWT_LIBRARY 387 JAVA_JVM_LIBRARY 388 JAVA_INCLUDE_PATH 389 JAVA_INCLUDE_PATH2) 390 391mark_as_advanced( 392 JAVA_AWT_LIBRARY 393 JAVA_JVM_LIBRARY 394 JAVA_INCLUDE_PATH 395 JAVA_INCLUDE_PATH2 396) 397 398set(JNI_LIBRARIES 399 ${JAVA_AWT_LIBRARY} 400 ${JAVA_JVM_LIBRARY} 401) 402 403set(JNI_INCLUDE_DIRS 404 ${JAVA_INCLUDE_PATH} 405 ${JAVA_INCLUDE_PATH2} 406) 407