Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Usage of native in Java [duplicate]

Tags:

java

native

Can someone explain the whys and the wherefores for using native keyword in Java?

like image 741
vaibhav Avatar asked May 25 '10 06:05

vaibhav


People also ask

What is the use of native modifier in Java?

The native modifier indicates that a method is implemented in platform-dependent code, often seen in C language. Native modifier indicates that a method is implemented in platform-dependent code, often in C.

Why clone method is native in Java?

Since cloning doesn't use constructor in order to create a copy of the object and since clone method creates a clone by invoking super. clone() which will call Object's clone method, it must be native in order to create new and equal object.

What is the use of native library in Java?

<uses-native-library>Specifies a vendor-provided shared native library that the application must be linked against. This element tells the system to make the native library accessible for the package.

What is native call in Java?

In software design, the Java Native Interface (JNI) is a foreign function interface programming framework that enables Java code running in a Java virtual machine (JVM) to call and be called by native applications (programs specific to a hardware and operating system platform) and libraries written in other languages ...


1 Answers

Can someone explain the whys and the wherefores for using native keyword in Java?

Once you see a small example, it becomes clear:

Main.java:

public class Main {
    public native int intMethod(int i);
    public static void main(String[] args) {
        System.loadLibrary("Main");
        System.out.println(new Main().intMethod(2));
    }
}

Main.c:

#include <jni.h>
#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_intMethod(
    JNIEnv *env, jobject obj, jint i) {
  return i * i;
}

Compile and run:

javac Main.java
javah -jni Main
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \
  -I${JAVA_HOME}/include/linux Main.c
java -Djava.library.path=. Main

Output:

4

Tested on Ubuntu 14.04 with Oracle JDK 1.8.0_45.

So it is clear that it allows you to:

  • call a compiled dynamically loaded library (here written in C) with arbitrary assembly code from Java
  • and get results back into Java

This could be used to:

  • write faster code on a critical section with better CPU assembly instructions (not CPU portable)
  • make direct system calls (not OS portable)

with the tradeoff of lower portability.

It is also possible for you to call Java from C, but you must first create a JVM in C: How to call Java functions from C++?

Example on GitHub for you to play with.

DISCLAIMER: part of this answer comes from my earlier answer. I believe that I have directly answered the OP's question in each.