Native Method example using JNI

Please note: this is a straight repost of an article I wrote about 10 years ago. I haven’t done anything with JNI lately, and can’t guarantee that it’s still correct, but I’d be surprised if things have changed much.

  1. Declare your native methods in an otherwise normal Java class.
    public class nativetest
    {
    public native String sayHello(String s);
    public static void main(String[] argv)
    {
    String retval = null;
    nativetest nt = new nativetest();
    retval = nt.sayHello(“Beavis”);
    System.out.println(“Invocation returned ” + retval);
    }
    }
  2. javac nativetest.java
    Standard Java compile
  3. javah -jni nativetest
    Generates .h files. Here is the code

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include 
    /* Header for class nativetest */
    
    #ifndef _Included_nativetest
    #define _Included_nativetest
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     nativetest
     * Method:    sayHello
     * Signature: (Ljava/lang/String;)Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_nativetest_sayHello
      (JNIEnv *, jobject, jstring);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
  4. Write your native code, using the .h file generated above Copy the function prototype from the .h file and paste it in.
    #include "nativetest.h"	/*double quotes tells it to search current directory*/
    
    JNIEXPORT jstring JNICALL Java_nativetest_sayHello
      (JNIEnv *env, jobject thisobject, jstring js)
    
    {
    	return js;
    }
  5. Compile
    cl -c /Ic:\jdk1.1.6\include /Ic:\jdk1.1.6\include\win32 nativetest.c 
    link /libpath=c:\jdk1.1.6\lib nativetest.obj /dll
    

    The above uses Microsoft Visual C++ command-line tools.

  6. Modify your java class to load the library.
    1. public class nativetest
      {
      	static {
      		System.loadLibrary("nativetest");
      	}
      	public native String sayHello(String s);
      	public static void main(String[] argv)
      	{
      		String retval = null;
      		nativetest nt = new nativetest();
      		retval = nt.sayHello("Beavis");
      		System.out.println("Invocation returned " + retval);
      	}
      }
      
  7.  run the example
    1. C:\jni\hello>java nativetest
      Invocation returned Beavis
      
Advertisements