1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
4 #[=======================================================================[.rst:
8 Find Java Native Interface (JNI) libraries.
10 JNI enables Java code running in a Java Virtual Machine (JVM) to call
11 and be called by native applications and libraries written in other
12 languages such as C, C++.
14 This module finds if Java is installed and determines where the
15 include files and libraries are. It also determines what the name of
16 the library is. The caller may set variable ``JAVA_HOME`` to specify a
17 Java installation prefix explicitly.
22 This module sets the following result variables:
25 the include dirs to use
27 the libraries to use (JAWT and JVM)
29 TRUE if JNI headers and libraries were found.
34 The following cache variables are also available to set or use:
37 the path to the Java AWT Native Interface (JAWT) library
39 the path to the Java Virtual Machine (JVM) library
41 the include path to jni.h
42 ``JAVA_INCLUDE_PATH2``
43 the include path to jni_md.h and jniport.h
44 ``JAVA_AWT_INCLUDE_PATH``
45 the include path to jawt.h
46 #]=======================================================================]
48 # Expand {libarch} occurrences to java_libarch subdirectory(-ies) and set ${_var}
49 macro(java_append_library_directories _var)
50 # Determine java arch-specific library subdir
51 # Mostly based on openjdk/jdk/make/common/shared/Platform.gmk as of openjdk
52 # 1.6.0_18 + icedtea patches. However, it would be much better to base the
53 # guess on the first part of the GNU config.guess platform triplet.
54 if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
55 if(CMAKE_LIBRARY_ARCHITECTURE STREQUAL "x86_64-linux-gnux32")
56 set(_java_libarch "x32" "amd64" "i386")
58 set(_java_libarch "amd64" "i386")
60 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
61 set(_java_libarch "i386")
62 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
63 set(_java_libarch "arm64" "aarch64")
64 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^alpha")
65 set(_java_libarch "alpha")
66 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
67 # Subdir is "arm" for both big-endian (arm) and little-endian (armel).
68 set(_java_libarch "arm" "aarch32")
69 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
70 # mips* machines are bi-endian mostly so processor does not tell
71 # endianness of the underlying system.
72 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}"
73 "mips" "mipsel" "mipseb" "mipsr6" "mipsr6el"
74 "mips64" "mips64el" "mips64r6" "mips64r6el"
75 "mipsn32" "mipsn32el" "mipsn32r6" "mipsn32r6el")
76 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le")
77 set(_java_libarch "ppc64" "ppc64le")
78 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
79 set(_java_libarch "ppc64" "ppc")
80 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
81 set(_java_libarch "ppc" "ppc64")
82 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc")
83 # Both flavors can run on the same processor
84 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "sparc" "sparcv9")
85 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(parisc|hppa)")
86 set(_java_libarch "parisc" "parisc64")
87 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390")
88 # s390 binaries can run on s390x machines
89 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "s390" "s390x")
90 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sh")
91 set(_java_libarch "sh")
93 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}")
96 # Append default list architectures if CMAKE_SYSTEM_PROCESSOR was empty or
97 # system is non-Linux (where the code above has not been well tested)
98 if(NOT _java_libarch OR NOT (CMAKE_SYSTEM_NAME MATCHES "Linux"))
99 list(APPEND _java_libarch "i386" "amd64" "ppc")
102 # Sometimes ${CMAKE_SYSTEM_PROCESSOR} is added to the list to prefer
103 # current value to a hardcoded list. Remove possible duplicates.
104 list(REMOVE_DUPLICATES _java_libarch)
106 foreach(_path ${ARGN})
107 if(_path MATCHES "{libarch}")
108 foreach(_libarch ${_java_libarch})
109 string(REPLACE "{libarch}" "${_libarch}" _newpath "${_path}")
110 if(EXISTS ${_newpath})
111 list(APPEND ${_var} "${_newpath}")
116 list(APPEND ${_var} "${_path}")
122 include(${CMAKE_CURRENT_LIST_DIR}/CMakeFindJavaCommon.cmake)
124 # Save CMAKE_FIND_FRAMEWORK
125 if(DEFINED CMAKE_FIND_FRAMEWORK)
126 set(_JNI_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
128 unset(_JNI_CMAKE_FIND_FRAMEWORK)
131 if(_JAVA_HOME_EXPLICIT)
132 set(CMAKE_FIND_FRAMEWORK NEVER)
135 set(JAVA_AWT_LIBRARY_DIRECTORIES)
137 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
138 ${_JAVA_HOME}/jre/lib/{libarch}
139 ${_JAVA_HOME}/jre/lib
140 ${_JAVA_HOME}/lib/{libarch}
148 macro (_JNI_GET_INSTALLED_VERSIONS _KIND)
149 execute_process(COMMAND REG QUERY "HKLM\\SOFTWARE\\JavaSoft\\${_KIND}"
150 RESULT_VARIABLE _JAVA_RESULT
151 OUTPUT_VARIABLE _JAVA_VERSIONS
153 if (NOT _JAVA_RESULT)
154 string (REGEX MATCHALL "HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\JavaSoft\\\\${_KIND}\\\\[0-9._]+" _JNI_VERSIONS "${_JAVA_VERSIONS}")
155 string (REGEX REPLACE "HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\JavaSoft\\\\${_KIND}\\\\([0-9._]+)" "\\1" _JNI_VERSIONS "${_JNI_VERSIONS}")
157 # sort versions. Most recent first
158 list (SORT _JNI_VERSIONS COMPARE NATURAL ORDER DESCENDING)
159 foreach (_JNI_VERSION IN LISTS _JNI_VERSIONS)
160 string(REPLACE "_" "." _JNI_CMAKE_VERSION "${_JNI_VERSION}")
161 if (JNI_FIND_VERSION_EXACT
162 AND NOT _JNI_CMAKE_VERSION MATCHES "^${JNI_FIND_VERSION}")
165 if (DEFINED JNI_FIND_VERSION AND _JNI_CMAKE_VERSION VERSION_LESS JNI_FIND_VERSION)
168 list(APPEND _JNI_HINTS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\${_KIND}\\${_JNI_VERSION};JavaHome]")
174 # for version 9 and upper
175 _JNI_GET_INSTALLED_VERSIONS("JDK")
177 # for versions older than 9
178 _JNI_GET_INSTALLED_VERSIONS("Java Development Kit")
180 foreach (_JNI_HINT IN LISTS _JNI_HINTS)
181 list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${_JNI_HINT}/lib")
185 set(_JNI_JAVA_DIRECTORIES_BASE
190 /usr/local/share/java
191 /usr/lib/j2sdk1.4-sun
192 /usr/lib/j2sdk1.5-sun
193 /opt/sun-jdk-1.5.0.04
194 /usr/lib/jvm/java-6-sun
195 /usr/lib/jvm/java-1.5.0-sun
196 /usr/lib/jvm/java-6-sun-1.6.0.00 # can this one be removed according to #8821 ? Alex
197 /usr/lib/jvm/java-6-openjdk
198 /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0 # fedora
199 # Debian specific paths for default JVM
200 /usr/lib/jvm/default-java
201 # Arch Linux specific paths for default JVM
203 # Ubuntu specific paths for default JVM
204 /usr/lib/jvm/java-11-openjdk-{libarch} # Ubuntu 18.04 LTS
205 /usr/lib/jvm/java-8-openjdk-{libarch} # Ubuntu 15.10
206 /usr/lib/jvm/java-7-openjdk-{libarch} # Ubuntu 15.10
207 /usr/lib/jvm/java-6-openjdk-{libarch} # Ubuntu 15.10
208 # OpenBSD specific paths for default JVM
213 # FreeBSD specific paths for default JVM
221 # SuSE specific paths for default JVM
226 set(_JNI_JAVA_AWT_LIBRARY_TRIES)
227 set(_JNI_JAVA_INCLUDE_TRIES)
229 foreach(_java_dir IN LISTS _JNI_JAVA_DIRECTORIES_BASE)
230 list(APPEND _JNI_JAVA_AWT_LIBRARY_TRIES
231 ${_java_dir}/jre/lib/{libarch}
233 ${_java_dir}/lib/{libarch}
237 list(APPEND _JNI_JAVA_INCLUDE_TRIES
242 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
243 ${_JNI_JAVA_AWT_LIBRARY_TRIES}
246 set(JAVA_JVM_LIBRARY_DIRECTORIES)
247 foreach(dir ${JAVA_AWT_LIBRARY_DIRECTORIES})
248 list(APPEND JAVA_JVM_LIBRARY_DIRECTORIES
252 # IBM SDK, Java Technology Edition, specific paths
258 set(JAVA_AWT_INCLUDE_DIRECTORIES)
260 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES ${_JAVA_HOME}/include)
263 foreach (_JNI_HINT IN LISTS _JNI_HINTS)
264 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${_JNI_HINT}/include")
268 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_INCLUDE_DIRECTORIES
269 ${_JNI_JAVA_INCLUDE_TRIES}
272 foreach(JAVA_PROG "${JAVA_RUNTIME}" "${JAVA_COMPILE}" "${JAVA_ARCHIVE}")
273 get_filename_component(jpath "${JAVA_PROG}" PATH)
274 foreach(JAVA_INC_PATH ../include ../java/include ../share/java/include)
275 if(EXISTS ${jpath}/${JAVA_INC_PATH})
276 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${jpath}/${JAVA_INC_PATH}")
279 foreach(JAVA_LIB_PATH
280 ../lib ../jre/lib ../jre/lib/i386
281 ../java/lib ../java/jre/lib ../java/jre/lib/i386
282 ../share/java/lib ../share/java/jre/lib ../share/java/jre/lib/i386)
283 if(EXISTS ${jpath}/${JAVA_LIB_PATH})
284 list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${jpath}/${JAVA_LIB_PATH}")
290 if(CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
291 set(_JNI_SEARCHES FRAMEWORK)
292 elseif(CMAKE_FIND_FRAMEWORK STREQUAL "NEVER")
293 set(_JNI_SEARCHES NORMAL)
294 elseif(CMAKE_FIND_FRAMEWORK STREQUAL "LAST")
295 set(_JNI_SEARCHES NORMAL FRAMEWORK)
297 set(_JNI_SEARCHES FRAMEWORK NORMAL)
299 set(_JNI_FRAMEWORK_JVM NAMES JavaVM)
300 set(_JNI_FRAMEWORK_JAWT "${_JNI_FRAMEWORK_JVM}")
302 set(_JNI_SEARCHES NORMAL)
307 PATHS ${JAVA_JVM_LIBRARY_DIRECTORIES}
312 PATHS ${JAVA_AWT_LIBRARY_DIRECTORIES}
315 foreach(search ${_JNI_SEARCHES})
316 find_library(JAVA_JVM_LIBRARY ${_JNI_${search}_JVM})
317 find_library(JAVA_AWT_LIBRARY ${_JNI_${search}_JAWT})
323 unset(_JNI_FRAMEWORK_JVM)
324 unset(_JNI_FRAMEWORK_JAWT)
325 unset(_JNI_NORMAL_JVM)
326 unset(_JNI_NORMAL_JAWT)
328 # Find headers matching the library.
329 if("${JAVA_JVM_LIBRARY};${JAVA_AWT_LIBRARY};" MATCHES "(/JavaVM.framework|-framework JavaVM);")
330 set(CMAKE_FIND_FRAMEWORK ONLY)
332 set(CMAKE_FIND_FRAMEWORK NEVER)
335 # add in the include path
336 find_path(JAVA_INCLUDE_PATH jni.h
337 ${JAVA_AWT_INCLUDE_DIRECTORIES}
340 find_path(JAVA_INCLUDE_PATH2 NAMES jni_md.h jniport.h
343 ${JAVA_INCLUDE_PATH}/darwin
344 ${JAVA_INCLUDE_PATH}/win32
345 ${JAVA_INCLUDE_PATH}/linux
346 ${JAVA_INCLUDE_PATH}/freebsd
347 ${JAVA_INCLUDE_PATH}/openbsd
348 ${JAVA_INCLUDE_PATH}/solaris
349 ${JAVA_INCLUDE_PATH}/hp-ux
350 ${JAVA_INCLUDE_PATH}/alpha
351 ${JAVA_INCLUDE_PATH}/aix
354 find_path(JAVA_AWT_INCLUDE_PATH jawt.h
358 # Restore CMAKE_FIND_FRAMEWORK
359 if(DEFINED _JNI_CMAKE_FIND_FRAMEWORK)
360 set(CMAKE_FIND_FRAMEWORK ${_JNI_CMAKE_FIND_FRAMEWORK})
361 unset(_JNI_CMAKE_FIND_FRAMEWORK)
363 unset(CMAKE_FIND_FRAMEWORK)
366 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
367 FIND_PACKAGE_HANDLE_STANDARD_ARGS(JNI DEFAULT_MSG JAVA_AWT_LIBRARY
371 JAVA_AWT_INCLUDE_PATH)
376 JAVA_AWT_INCLUDE_PATH
388 ${JAVA_INCLUDE_PATH2}
389 ${JAVA_AWT_INCLUDE_PATH}