> For the complete documentation index, see [llms.txt](https://apertus.gitbook.io/vr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://apertus.gitbook.io/vr/plugins-android/jni-plugin-android.md).

# Java Native Interface

### The Java Native Interface

The Java Native Interface (JNI) is a native language support, which allows Java code (running on JVM) to interoperate with applications and libraries written in C and C++. JNI provides a one-way access to call C/C++ functions from Java. Therefore it helps to use ApertusVR's features from Java codes, which is indispensably important, when programming on Android.

![](/files/-MESB0fF80Cws5cYVge5)

To learn more about the JNI interface see the official documentation on [Oracle's website](https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html). For an easy to follow tutorial check [NTU Signapore's guide](https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html).

### Overview of the plugin

ApertusVR uses the JNI language support as a **plugin**, which helps distribute the events, and implements wrapper functionality for ApertusVR entities. The *JNI-plugin* consists of three layers:

1. The C++ layer (apeJNIPlugin shared library)
2. Java static native functions (ApertusJNI.java)
3. Wrapper classes (ape\<CppClassName>.java)

#### 1. The C++ layer

This layer is an ordinary ape::IPlugin implementation, which gather the events into its event queue, then when somebody calls the appropriate function in Java (`ApertusJNI.processEventDoubleQueue()`), the plugin fires the events on the Java side, using the JNI's callback possibilities.

#### 2. ApertusJNI

This is a static Java class, which contains the Java "headers" of the C++ JNI functions, and everything else needed to use the plugin in Java.&#x20;

#### 3. Wrapper classes

For each subclass of `ape::Entity` in ApertusVR, there is a corresponding Java class (the `ape::Entity` is also included), which provides an interface to access, query, and modify an object on the C++ side. These wrapper classes contains only a `String`, and a `apeEntity.Type` member variables, which makes it available to identify the entity related to the interface object. Then it calls the `static native`functions in ApertusJNI, to access the entity in C++.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://apertus.gitbook.io/vr/plugins-android/jni-plugin-android.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
