Quantcast
Channel: C – Phaisarn Sutheebanjard
Viewing all articles
Browse latest Browse all 12

Java Native Interface (JNI)

$
0
0

Java supports native codes via the Java Native Interface (JNI).
1. JNI with C

1.1: Write a Java Class that uses C Codes – hello.java 1
1.2: Create the C/C++ Header file – hello.h 2
1.3: C Implementation – HelloJNI.c 2
1.4: Run the Java Program 3

1.  JNI with C

 

1.1: Write a Java Class that uses C Codes – hello.java

$ nano hello.java
public class hello {
    static {
        System.loadLibrary ( "hello" ) ;
    }

    public native void sayHello(int length) ;

    public static void main (String args[]) {
        String str = "I am a good boy" ;
        hello h = new hello () ;
        h.sayHello (str.length() ) ;
    }
}

The static initializer invokes System.loadLibrary() to load the native library “hello” (which contains the native method sayHello()) during the class loading. It will be mapped to “libhello.so“. You could include the library into Java Library’s path via JVM argument -Djava.library.path=path_to_lib.
Next, we declare the method sayHello() as a native instance method, via keyword native, which denotes that this method is implemented in another language. A native method does not contain a body. The sayHello() is contained in the native library loaded.
The main() method allocate an instance of hello and invoke the native method sayHello().
Compile the “hello.java” into “hello.class”.

$ javac hello.java 
$ ls -l
total 8
-rw-rw-r-- 1 jack jack 527 พ.ย. 24 16:02 hello.class
-rw-rw-r-- 1 jack jack 294 พ.ย. 24 16:01 hello.java

1.2: Create the C/C++ Header file – hello.h

(get .h)

$ javah hello
$ ls -l
total 12
-rw-rw-r-- 1 jack jack 527 พ.ย. 24 16:02 hello.class
-rw-rw-r-- 1 jack jack 365 พ.ย. 24 16:02 hello.h
-rw-rw-r-- 1 jack jack 294 พ.ย. 24 16:01 hello.java

 

$ cat hello.h 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class hello */

#ifndef _Included_hello
#define _Included_hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class: hello
 * Method: sayHello
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_hello_sayHello
 (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

 

1.3: C Implementation – HelloJNI.c

 

$ nano hello.c
#include<stdio.h>
#include<jni.h>
#include "hello.h"

JNIEXPORT void JNICALL Java_hello_sayHello (JNIEnv *env, jobject object, jint len) {
    printf ( "Length is %d\n", len );
}

(get .o)

$ gcc -fPIC -c hello.c -I $JAVA_HOME/include
jack@jack14043:~/JNI2$ ls -l
total 20
-rw-rw-r-- 1 jack jack 179 พ.ย. 24 16:04 hello.c
-rw-rw-r-- 1 jack jack 527 พ.ย. 24 16:02 hello.class
-rw-rw-r-- 1 jack jack 365 พ.ย. 24 16:02 hello.h
-rw-rw-r-- 1 jack jack 294 พ.ย. 24 16:01 hello.java
-rw-rw-r-- 1 jack jack 1584 พ.ย. 24 16:04 hello.o

(get .so)

$ gcc hello.o -shared -o libhello.so -Wl,-soname,hello
$ ls -l
total 28
-rw-rw-r-- 1 jack jack 179 พ.ย. 24 16:04 hello.c
-rw-rw-r-- 1 jack jack 527 พ.ย. 24 16:02 hello.class
-rw-rw-r-- 1 jack jack 365 พ.ย. 24 16:02 hello.h
-rw-rw-r-- 1 jack jack 294 พ.ย. 24 16:01 hello.java
-rw-rw-r-- 1 jack jack 1584 พ.ย. 24 16:04 hello.o
-rwxrwxr-x 1 jack jack 8019 พ.ย. 24 16:06 libhello.so

1.4: Run the Java Program

$ java -Djava.library.path=. hello
Length is 15

 

 

LInk


Viewing all articles
Browse latest Browse all 12

Trending Articles