1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
8 # Find JNI java libraries.
10 # This module finds if Java is installed and determines where the
11 # include files and libraries are. It also determines what the name of
12 # the library is. The caller may set variable JAVA_HOME to specify a
13 # Java installation prefix explicitly.
15 # This module sets the following result variables:
19 # JNI_INCLUDE_DIRS = the include dirs to use
20 # JNI_LIBRARIES = the libraries to use
21 # JNI_FOUND = TRUE if JNI headers and libraries were found.
22 # JAVA_AWT_LIBRARY = the path to the jawt library
23 # JAVA_JVM_LIBRARY = the path to the jvm library
24 # JAVA_INCLUDE_PATH = the include path to jni.h
25 # JAVA_INCLUDE_PATH2 = the include path to jni_md.h
26 # JAVA_AWT_INCLUDE_PATH = the include path to jawt.h
28 # Expand {libarch} occurrences to java_libarch subdirectory(-ies) and set ${_var}
29 macro(java_append_library_directories _var)
30 # Determine java arch-specific library subdir
31 # Mostly based on openjdk/jdk/make/common/shared/Platform.gmk as of openjdk
32 # 1.6.0_18 + icedtea patches. However, it would be much better to base the
33 # guess on the first part of the GNU config.guess platform triplet.
34 if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
35 if(CMAKE_LIBRARY_ARCHITECTURE STREQUAL "x86_64-linux-gnux32")
36 set(_java_libarch "x32" "amd64" "i386")
38 set(_java_libarch "amd64" "i386")
40 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
41 set(_java_libarch "i386")
42 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^alpha")
43 set(_java_libarch "alpha")
44 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
45 # Subdir is "arm" for both big-endian (arm) and little-endian (armel).
46 set(_java_libarch "arm" "aarch32")
47 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
48 # mips* machines are bi-endian mostly so processor does not tell
49 # endianness of the underlying system.
50 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}"
51 "mips" "mipsel" "mipseb" "mipsr6" "mipsr6el"
52 "mips64" "mips64el" "mips64r6" "mips64r6el"
53 "mipsn32" "mipsn32el" "mipsn32r6" "mipsn32r6el")
54 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le")
55 set(_java_libarch "ppc64" "ppc64le")
56 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
57 set(_java_libarch "ppc64" "ppc")
58 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
59 set(_java_libarch "ppc" "ppc64")
60 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc")
61 # Both flavours can run on the same processor
62 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "sparc" "sparcv9")
63 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(parisc|hppa)")
64 set(_java_libarch "parisc" "parisc64")
65 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390")
66 # s390 binaries can run on s390x machines
67 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "s390" "s390x")
68 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sh")
69 set(_java_libarch "sh")
71 set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}")
74 # Append default list architectures if CMAKE_SYSTEM_PROCESSOR was empty or
75 # system is non-Linux (where the code above has not been well tested)
76 if(NOT _java_libarch OR NOT (CMAKE_SYSTEM_NAME MATCHES "Linux"))
77 list(APPEND _java_libarch "i386" "amd64" "ppc")
80 # Sometimes ${CMAKE_SYSTEM_PROCESSOR} is added to the list to prefer
81 # current value to a hardcoded list. Remove possible duplicates.
82 list(REMOVE_DUPLICATES _java_libarch)
84 foreach(_path ${ARGN})
85 if(_path MATCHES "{libarch}")
86 foreach(_libarch ${_java_libarch})
87 string(REPLACE "{libarch}" "${_libarch}" _newpath "${_path}")
88 if(EXISTS ${_newpath})
89 list(APPEND ${_var} "${_newpath}")
94 list(APPEND ${_var} "${_path}")
100 include(${CMAKE_CURRENT_LIST_DIR}/CMakeFindJavaCommon.cmake)
102 # Save CMAKE_FIND_FRAMEWORK
103 if(DEFINED CMAKE_FIND_FRAMEWORK)
104 set(_JNI_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
106 unset(_JNI_CMAKE_FIND_FRAMEWORK)
109 if(_JAVA_HOME_EXPLICIT)
110 set(CMAKE_FIND_FRAMEWORK NEVER)
113 set(JAVA_AWT_LIBRARY_DIRECTORIES)
115 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
116 ${_JAVA_HOME}/jre/lib/{libarch}
117 ${_JAVA_HOME}/jre/lib
118 ${_JAVA_HOME}/lib/{libarch}
126 execute_process(COMMAND REG QUERY HKLM\\SOFTWARE\\JavaSoft\\JDK /f "." /k
127 RESULT_VARIABLE _JNI_RESULT
128 OUTPUT_VARIABLE _JNI_VERSIONS
131 string (REGEX MATCHALL "HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\JavaSoft\\\\JDK\\\\[0-9.]+" _JNI_VERSIONS "${_JNI_VERSIONS}")
133 # sort versions. Most recent first
134 ## handle version 9 apart from other versions to get correct ordering
135 set (_JNI_V9 ${_JNI_VERSIONS})
136 list (FILTER _JNI_VERSIONS EXCLUDE REGEX "JDK\\\\9")
137 list (SORT _JNI_VERSIONS)
138 list (REVERSE _JNI_VERSIONS)
139 list (FILTER _JNI_V9 INCLUDE REGEX "JDK\\\\9")
141 list (REVERSE _JNI_V9)
142 list (APPEND _JNI_VERSIONS ${_JNI_V9})
143 foreach (_JNI_HINT IN LISTS _JNI_VERSIONS)
144 list(APPEND _JNI_HINTS "[${_JNI_HINT};JavaHome]")
149 foreach (_JNI_HINT IN LISTS _JNI_HINTS)
150 list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${_JNI_HINT}/lib")
153 get_filename_component(java_install_version
154 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit;CurrentVersion]" NAME)
156 list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES
157 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/lib"
158 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/lib"
159 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/lib"
160 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/lib"
161 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/lib"
162 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/lib"
163 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/lib"
164 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/lib"
168 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
169 /usr/lib/jvm/java/lib
170 /usr/lib/java/jre/lib/{libarch}
171 /usr/lib/jvm/jre/lib/{libarch}
172 /usr/local/lib/java/jre/lib/{libarch}
173 /usr/local/share/java/jre/lib/{libarch}
174 /usr/lib/j2sdk1.4-sun/jre/lib/{libarch}
175 /usr/lib/j2sdk1.5-sun/jre/lib/{libarch}
176 /opt/sun-jdk-1.5.0.04/jre/lib/{libarch}
177 /usr/lib/jvm/java-6-sun/jre/lib/{libarch}
178 /usr/lib/jvm/java-1.5.0-sun/jre/lib/{libarch}
179 /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/{libarch} # can this one be removed according to #8821 ? Alex
180 /usr/lib/jvm/java-6-openjdk/jre/lib/{libarch}
181 /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/{libarch} # fedora
182 # Debian specific paths for default JVM
183 /usr/lib/jvm/default-java/jre/lib/{libarch}
184 /usr/lib/jvm/default-java/jre/lib
185 /usr/lib/jvm/default-java/lib
186 # Arch Linux specific paths for default JVM
187 /usr/lib/jvm/default/jre/lib/{libarch}
188 /usr/lib/jvm/default/lib/{libarch}
189 # Ubuntu specific paths for default JVM
190 /usr/lib/jvm/java-8-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 15.10
191 /usr/lib/jvm/java-7-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 15.10
192 /usr/lib/jvm/java-6-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 15.10
193 # OpenBSD specific paths for default JVM
194 /usr/local/jdk-1.7.0/jre/lib/{libarch}
195 /usr/local/jre-1.7.0/lib/{libarch}
196 /usr/local/jdk-1.6.0/jre/lib/{libarch}
197 /usr/local/jre-1.6.0/lib/{libarch}
198 # SuSE specific paths for default JVM
199 /usr/lib64/jvm/java/jre/lib/{libarch}
200 /usr/lib64/jvm/jre/lib/{libarch}
203 set(JAVA_JVM_LIBRARY_DIRECTORIES)
204 foreach(dir ${JAVA_AWT_LIBRARY_DIRECTORIES})
205 list(APPEND JAVA_JVM_LIBRARY_DIRECTORIES
209 # IBM SDK, Java Technology Edition, specific paths
215 set(JAVA_AWT_INCLUDE_DIRECTORIES)
217 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES ${_JAVA_HOME}/include)
220 foreach (_JNI_HINT IN LISTS _JNI_HINTS)
221 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${_JNI_HINT}/include")
223 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES
224 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/include"
225 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/include"
226 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/include"
227 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/include"
228 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/include"
229 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/include"
230 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/include"
231 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/include"
235 JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_INCLUDE_DIRECTORIES
236 /usr/lib/java/include
237 /usr/local/lib/java/include
238 /usr/lib/jvm/java/include
239 /usr/lib/jvm/java-6-sun/include
240 /usr/lib/jvm/java-1.5.0-sun/include
241 /usr/lib/jvm/java-6-sun-1.6.0.00/include # can this one be removed according to #8821 ? Alex
242 /usr/lib/jvm/java-6-openjdk/include
243 /usr/lib/jvm/java-8-openjdk-{libarch}/include # ubuntu 15.10
244 /usr/lib/jvm/java-7-openjdk-{libarch}/include # ubuntu 15.10
245 /usr/lib/jvm/java-6-openjdk-{libarch}/include # ubuntu 15.10
246 /usr/local/share/java/include
247 /usr/lib/j2sdk1.4-sun/include
248 /usr/lib/j2sdk1.5-sun/include
249 /opt/sun-jdk-1.5.0.04/include
250 # Debian specific path for default JVM
251 /usr/lib/jvm/default-java/include
252 # Arch specific path for default JVM
253 /usr/lib/jvm/default/include
254 # OpenBSD specific path for default JVM
255 /usr/local/jdk-1.7.0/include
256 /usr/local/jdk-1.6.0/include
257 # SuSE specific paths for default JVM
258 /usr/lib64/jvm/java/include
261 foreach(JAVA_PROG "${JAVA_RUNTIME}" "${JAVA_COMPILE}" "${JAVA_ARCHIVE}")
262 get_filename_component(jpath "${JAVA_PROG}" PATH)
263 foreach(JAVA_INC_PATH ../include ../java/include ../share/java/include)
264 if(EXISTS ${jpath}/${JAVA_INC_PATH})
265 list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${jpath}/${JAVA_INC_PATH}")
268 foreach(JAVA_LIB_PATH
269 ../lib ../jre/lib ../jre/lib/i386
270 ../java/lib ../java/jre/lib ../java/jre/lib/i386
271 ../share/java/lib ../share/java/jre/lib ../share/java/jre/lib/i386)
272 if(EXISTS ${jpath}/${JAVA_LIB_PATH})
273 list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${jpath}/${JAVA_LIB_PATH}")
279 if(CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
280 set(_JNI_SEARCHES FRAMEWORK)
281 elseif(CMAKE_FIND_FRAMEWORK STREQUAL "NEVER")
282 set(_JNI_SEARCHES NORMAL)
283 elseif(CMAKE_FIND_FRAMEWORK STREQUAL "LAST")
284 set(_JNI_SEARCHES NORMAL FRAMEWORK)
286 set(_JNI_SEARCHES FRAMEWORK NORMAL)
288 set(_JNI_FRAMEWORK_JVM NAMES JavaVM)
289 set(_JNI_FRAMEWORK_JAWT "${_JNI_FRAMEWORK_JVM}")
291 set(_JNI_SEARCHES NORMAL)
296 PATHS ${JAVA_JVM_LIBRARY_DIRECTORIES}
301 PATHS ${JAVA_AWT_LIBRARY_DIRECTORIES}
304 foreach(search ${_JNI_SEARCHES})
305 find_library(JAVA_JVM_LIBRARY ${_JNI_${search}_JVM})
306 find_library(JAVA_AWT_LIBRARY ${_JNI_${search}_JAWT})
312 unset(_JNI_FRAMEWORK_JVM)
313 unset(_JNI_FRAMEWORK_JAWT)
314 unset(_JNI_NORMAL_JVM)
315 unset(_JNI_NORMAL_JAWT)
317 # Find headers matching the library.
318 if("${JAVA_JVM_LIBRARY};${JAVA_AWT_LIBRARY};" MATCHES "(/JavaVM.framework|-framework JavaVM);")
319 set(CMAKE_FIND_FRAMEWORK ONLY)
321 set(CMAKE_FIND_FRAMEWORK NEVER)
324 # add in the include path
325 find_path(JAVA_INCLUDE_PATH jni.h
326 ${JAVA_AWT_INCLUDE_DIRECTORIES}
329 find_path(JAVA_INCLUDE_PATH2 NAMES jni_md.h jniport.h
332 ${JAVA_INCLUDE_PATH}/darwin
333 ${JAVA_INCLUDE_PATH}/win32
334 ${JAVA_INCLUDE_PATH}/linux
335 ${JAVA_INCLUDE_PATH}/freebsd
336 ${JAVA_INCLUDE_PATH}/openbsd
337 ${JAVA_INCLUDE_PATH}/solaris
338 ${JAVA_INCLUDE_PATH}/hp-ux
339 ${JAVA_INCLUDE_PATH}/alpha
340 ${JAVA_INCLUDE_PATH}/aix
343 find_path(JAVA_AWT_INCLUDE_PATH jawt.h
347 # Restore CMAKE_FIND_FRAMEWORK
348 if(DEFINED _JNI_CMAKE_FIND_FRAMEWORK)
349 set(CMAKE_FIND_FRAMEWORK ${_JNI_CMAKE_FIND_FRAMEWORK})
350 unset(_JNI_CMAKE_FIND_FRAMEWORK)
352 unset(CMAKE_FIND_FRAMEWORK)
355 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
356 FIND_PACKAGE_HANDLE_STANDARD_ARGS(JNI DEFAULT_MSG JAVA_AWT_LIBRARY
360 JAVA_AWT_INCLUDE_PATH)
365 JAVA_AWT_INCLUDE_PATH
377 ${JAVA_INCLUDE_PATH2}
378 ${JAVA_AWT_INCLUDE_PATH}