FindJNI¶
Finds the Java Native Interface (JNI) include directories and libraries.
JNI enables Java code running in a Java Virtual Machine (JVM) or Dalvik Virtual Machine (DVM) on Android to call and be called by native applications and libraries written in other languages such as C and C++.
This module finds if Java is installed and determines where the include files and libraries are. It also determines what the name of the library is.
在 3.24 版被加入: Imported targets, components, and Android NDK support.
When using Android NDK, the corresponding package version is reported and a
specific release can be requested. At Android API level 31 and above, the
additional NativeHelper
component can be requested. NativeHelper
is
also exposed as an implicit dependency of the JVM
component (only if this
does not cause a conflict) which provides a uniform access to JVM functions.
Components¶
This module supports optional components, which can be specified with the
find_package()
command:
find_package(JNI [COMPONENTS <components>...])
Supported components include:
AWT
在 3.24 版被加入.
Finds the Java Abstract Window Toolkit (AWT).
JVM
在 3.24 版被加入.
Finds the Java Virtual Machine (JVM).
NativeHelper
在 3.24 版被加入.
Finds the NativeHelper library on Android (
libnativehelper.so
), which exposes JVM functions such asJNI_CreateJavaVM()
.
If no components are specified, the module defaults are:
When targeting Android with API level 31 and above: module looks for the
NativeHelper
component. For other Android API levels, components are by default not set.When targeting other systems: module looks for
AWT
andJVM
components.
Imported Targets¶
This module provides the following Imported Targets:
JNI::JNI
在 3.24 版被加入.
Main target encapsulating all JNI usage requirements, available if
jni.h
is found.JNI::AWT
在 3.24 版被加入.
Target encapsulating the Java AWT Native Interface (JAWT) library usage requirements, available if the
AWT
component is found.JNI::JVM
在 3.24 版被加入.
Target encapsulating the Java Virtual Machine (JVM) library usage requirements, available if component
JVM
is found.JNI::NativeHelper
在 3.24 版被加入.
Target encapsulating the NativeHelper library usage requirements, available when targeting Android API level 31 and above, and the library is found.
結果變數¶
This module defines the following variables:
JNI_FOUND
Boolean indicating whether the JNI is found.
JNI_<component>_FOUND
在 3.24 版被加入.
Boolean indicating whether the
<component>
is found.JNI_VERSION
Full Android NDK package version (including suffixes such as
-beta3
and-rc1
) or undefined otherwise.JNI_VERSION_MAJOR
在 3.24 版被加入.
Android NDK major version or undefined otherwise.
JNI_VERSION_MINOR
在 3.24 版被加入.
Android NDK minor version or undefined otherwise.
JNI_VERSION_PATCH
在 3.24 版被加入.
Android NDK patch version or undefined otherwise.
JNI_INCLUDE_DIRS
The include directories needed to use the JNI.
JNI_LIBRARIES
The libraries (JAWT and JVM) needed to link against to use JNI.
快取變數¶
The following cache variables are also available to set or use:
JAVA_INCLUDE_PATH
The directory containing the
jni.h
header.JAVA_INCLUDE_PATH2
The directory containing machine-dependent headers
jni_md.h
andjniport.h
. This variable is defined only ifjni.h
depends on one of these headers. In contrast, Android NDKjni.h
can be typically used standalone.JAVA_AWT_INCLUDE_PATH
The directory containing the
jawt.h
header.JAVA_AWT_LIBRARY
The path to the Java AWT Native Interface (JAWT) library.
JAVA_JVM_LIBRARY
The path to the Java Virtual Machine (JVM) library.
Hints¶
This module accepts the following variables:
JAVA_HOME
The caller can set this variable to specify the installation directory of Java explicitly.
範例¶
Finding JNI and linking it to a project target:
find_package(JNI)
target_link_libraries(project_target PRIVATE JNI::JNI)
Finding JNI with AWT component specified and linking them to a project target:
find_package(JNI COMPONENTS AWT)
target_link_libraries(project_target PRIVATE JNI::JNI JNI::AWT)
A more common way to use Java and JNI in CMake is to use a dedicated
UseJava
module:
find_package(Java)
find_package(JNI)
include(UseJava)