A Technology Blog About Code Development, Architecture, Operating System, Hardware, Tips and Tutorials for Developers.

Showing posts with label NATIVE. Show all posts
Showing posts with label NATIVE. Show all posts

Friday, July 9, 2010

JNI WITH UBUNTU

5:18:00 PM Posted by Satish , , , 1 comment

Most of the native methods are written in "C". The mechanism to integrate "C" code with a Java program is called the Java Native Interface(JNI).

Java Client to call native method :

package org.satish.chapter_13;

public class NativeDemo {
    int i;
    public static void main(String[] args) {
        NativeDemo ob = new NativeDemo();
       
        ob.i = 10;
        System.out.println("This is ob.i before this native method : " + ob.i);
        ob.test();
        System.out.println("This is ob.i after this native method : " + ob.i);
    }
   
    public native void test();

   
    static{
        System.load("/home/satish/workspace/CompleteReference2010/bin/NativeDemo.so");
    }
}

Create headed file out of the Class :

Before to this compile the java to ".class" file. Now it is ready to create the ".h "file.

javah -jni org.satish.chapter_13.NativeDemo

Content of the header file :

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class org_satish_chapter_13_NativeDemo */

#ifndef _Included_org_satish_chapter_13_NativeDemo
#define _Included_org_satish_chapter_13_NativeDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_satish_chapter_13_NativeDemo
 * Method:    test
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_org_satish_chapter_113_NativeDemo_test
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

The C program : 

/*
    This file contains the C version of the test()
*/

#include
#include "org_satish_chapter_13_NativeDemo.h"
#include
JNIEXPORT void JNICALL Java_org_satish_chapter_113_NativeDemo_test(JNIEnv *env, jobject obj)
{
    jclass cls;
    jfieldID fid;
    jint i;
   
    printf("Starting the native method. \n");
    cls = (*env) ->GetObjectClass(env, obj);
    fid = (*env) ->GetFieldID(env, cls, "i", "I");

    if(fid == 0){
        printf("could not get field id. \n");
        return;
    }
    i = (*env)->GetIntField(env, obj, fid);
    printf("i = %d\n",i);
    (*env)->SetIntField(env,obj,fid,2*i);
    printf("Ending the native method.\n");
}

Create .SO file : 

Before to create the .so file, you need to install the gcc in your system.

sudo apt-get install gcc

Once gcc is installed, you can create the .so file using the following command.

sudo gcc -I /usr/lib/jvm/java-6-sun-1.6.0.20/include/linux/ -o NativeDemo.so -shared NativeDemo.c

Now your java class is ready to run and following is the output.

This is ob.i before this native method : 10
This is ob.i after this native method : 20
Starting the native method.
i = 10
Ending the native method.