Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are native methods in Java and where should they be used? [duplicate]

Tags:

java

native

A native method has the same syntax as an abstract method, but where is it implemented?

like image 572
niks Avatar asked Sep 19 '13 16:09

niks


People also ask

What are the native methods 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 are native methods of object class in Java?

protected native Object clone() throws CloneNotSupportedException. public boolean equals(Object obj) protected void finalize() throws Throwable.

What is native method interface in Java?

The JNI is a native programming interface. It allows Java code that runs inside a Java Virtual Machine (VM) to interoperate with applications and libraries written in other programming languages, such as C, C++, and assembly.


1 Answers

What are native methods in Java and where should they be used?

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.