• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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