Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does a JVM have to do when calling a native method?

What are the usual steps that the JVM runtime has to perform when calling a Java method that is declared as native?

How does a HotSpot 1.8.0 JVM implement a JNI function call? What checking steps are involved (e.g. unhandled exceptions after return?), what bookkeeping has the JVM to perform (e.g. a local reference registry?), and where does the control go after the call of the native Java method? I would also appreciate it if someone could provide the entry point or important methods from the native HotSpot 1.8.0 code.

Disclaimer: I know that I can read the code myself but a prior explanation helps in quickly finding my way through the code. Additionally, I found this question worthwhile to be Google searchable. ;)

like image 921
box Avatar asked Jul 14 '14 22:07

box


People also ask

How native method works in Java?

Native methods are Java™ methods that start in a language other than Java. Native methods can access system-specific functions and APIs that are not available directly in Java. The use of native methods limits the portability of an application, because it involves system-specific code.

What is native code in JVM?

The Java Native Interface (JNI) establishes a well-defined and platform-independent interface between the two. Native code can be used together with Java in two distinct ways: as "native methods" in a running JVM and as the code that creates a JVM using the "Invocation API".

What is native method call?

Native methods are platform-specific code. They are usually written in languages such as C or C++ and contained in libraries(dll's). It is possible to create a hybrid Java application that benefits from such libraries. Reasons for Using Native Methods.

How to use system calls in JVM?

Now,In case Java application, when JVM encounters any use of such service in your program, it uses system calls exposed by OS. To use/call these system calls, JVM maintains another stack with Java stack called "Native method stack" (like C application stack) with every running thread of your Java application.

What is the JVM in Java?

JVM is a part of JRE (Java Runtime Environment). Java applications are called WORA (Write Once Run Anywhere). This means a programmer can develop Java code on one system and can expect it to run on any other Java-enabled system without any adjustment. This is all possible because of JVM.

What is the use of JNI in JVM?

JNI is the tool that we use when we have to bridge between the virtual machine world, and the world of C, C++, etc.. The reverse is also true. It is not possible to actually get a JVM running without using JNI.

What is Java Native Interface (JNI)?

When you run java.exe, then there are a couple of Java Native Interface (JNI) calls. These calls load the DLL that is really the JVM (that’s right – java.exe is NOT the JVM). JNI is the tool that we use when we have to bridge between the virtual machine world, and the world of C, C++, etc..


1 Answers

Calling a JNI method from Java is rather expensive comparing to a simple C function call. HotSpot typically performs most of the following steps to invoke a JNI method:

  1. Create a stack frame.
  2. Move arguments to proper register or stack locations according to ABI.
  3. Wrap object references to JNI handles.
  4. Obtain JNIEnv* and jclass for static methods and pass them as additional arguments.
  5. Check if should call method_entry trace function.
  6. Lock an object monitor if the method is synchronized.
  7. Check if the native function is linked already. Function lookup and linking is performed lazily.
  8. Switch thread from in_java to in_native state.
  9. Call the native function
  10. Check if safepoint is needed.
  11. Return thread to in_java state.
  12. Unlock monitor if locked.
  13. Notify method_exit.
  14. Unwrap object result and reset JNI handles block.
  15. Handle JNI exceptions.
  16. Remove the stack frame.

The source code for this procedure can be found at SharedRuntime::generate_native_wrapper.

As you can see, an overhead may be significant. But in many cases most of the above steps are not necessary. For example, if a native method just performs some encoding/decoding on a byte array and does not throw any exceptions nor it calls other JNI functions. For these cases HotSpot has a non-standard (and not known) convention called Critical Natives, discussed here.

like image 118
apangin Avatar answered Oct 12 '22 22:10

apangin