Click here to Skip to main content
Click here to Skip to main content

JNI Basics - 1

, 10 Sep 2002
Rate this:
Please Sign up or sign in to vote.
Calling native functions which are written in C or C++ from Java, using JNI.


In this tutorial, I will try to explain how to call native functions which are written in C or C++ from Java, using JNI.

What is JNI

JNI is an acronym of Java Native Interface. Using JNI, we can call functions which are written in other languages from Java. Advantages and disadvantages of this method are as follows:


  1. You can use your existing library which was previously written in another language.
  2. You can call Windows API functions.
  3. For the sake of execution speed.
  4. You can call API functions of some server product which is in C or C++, from Java client.


  1. You can’t say "write once run anywhere".
  2. Difficult to debug runtime error in native code.
  3. Potential security risk.
  4. You can’t call it from Applets.

Here we will try to call the MFC function AfxMessageBox() from Java. Our function in C++ will take no arguments and will not return any value.

class Test1
    public static void main(String ar[])
        System.out.println("Hello world from Java");
        Test1 t=new Test1();
    public native void inDll();

In static block, we are loading a DLL named TestDll.dll which should be placed in <WINDIR>/SYSTEM32 directory. I am not saying you cannot put this DLL in other directories, you can, but then you will have to register that path in JVM. Here you can call another method as well, instead of loadLibrary().


I think load() method is better as far as usage is concerned because you can easily place your DLL in any directory.

public native void inDll();

As you can guess, this native keyword specifies that inDll() is a native function which is implemented in the library. Also noticeable, there is no implementation. When we call this function in our code, JVM will look for the function in the loaded DLL (due to static block, DLL will be loaded immediately after the loading of the class) and then call that function. Otherwise it will throw java.lang.UnsatisfiedLinkError exception.

Compile this class normally. Now we will need to generate header file of this class.

You can use javah.exe utility which is included with JDK.

Javah -jni Test1

Header file is generated in current directory with the name Test1.h. Keep this header file safe as we will use this soon.

Now we are going to write a DLL which will contain the implementation of our native function. I have chosen MFC AppWizard (DLL) in project and named my project: TestDll.

Include your class header file which was generated previously using javah.exe in TestDll.h.

Copy following line from Test1.h and paste it at the end of TestDll.h.

JNIEXPORT void JNICALL Java_Test1_inDll(JNIEnv *, jobject);

Change this line to:

JNIEXPORT void JNICALL Java_Test1_inDll(JNIEnv *env, jobject obj)
    AfxMessageBox("Hello World from dll");

Compile this DLL, you will get an error from compiler because compiler was unable to find jni.h file which is included in Test1.h. So include the following two directories in IDE settings.

  • <Drive>:\<JDK Directory>\include
  • <Drive>:\<JDK Directory>\include\win32

Go to Project/Settings, on C/C++ tab, go to Project option, insert following lines at the end:

/I "<Drive>:\<JDK Directory>\include "
/I "<Drive>:\<JDK Directory>\include\win32"

Now compile and generate your DLL, put newly created DLL in system32 directory and then run your class file. It should work properly. If you receive an error like UnsatisfiedLinkError, then recheck your procedure. If you are using any IDE, then try using command prompt. Hope it will work.

In this tutorial, I have tried to explain the basics of JNI. I will write a second tutorial of the series soon in which I will explain how to pass parameters to native functions and return something, along with a practical example.

Waiting for your comments and questions.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Irfan Dawood
Web Developer
Pakistan Pakistan
Irfan Dawood is the junior year student at Department of Computer Science, University of Karachi. His interest includes programming in C++ and Java.

Comments and Discussions

GeneralRe: Using Visual Studio 2005 PinmemberCodeKayak22-Nov-06 12:48 
GeneralRe: Using Visual Studio 2005 Pinmemberfish.soluble22-Feb-07 7:23 
GeneralRe: Using Visual Studio 2005 Pinmemberthebigandroid13-May-08 12:33 
Generalsupermarket simulation Pinmembermccleon3-Mar-06 7:35 
Does anyone know how to do the simulation to aswer 3
questions at the bottom? if so help me. I have the program
running but I don't know how to find the answers to the
questions. The problem is below

Write a program that simulates a checkout line at a
supermarket. The line is a queue object. Customers (i.e.,
customer objects) arrive in random integer intervals of
from 1 to 4 minutes. Also, each customer is serviced in
random integer intervals of from 1 to 4 minutes. Obviously,
the rates need to be balanced. If the average arrival rate
is larger than the average service rate, the queue will
grow infinitely. Even with “balanced” rates, randomness can
still cause long lines. Run the supermarket simulation for
a 12-hour day (720 minutes), using the following algorithm:

a) Choose a random integer between 1 and 4 to determine
the minute at which the first customer arrives.
b) At the first customer’s arrival time, do the following:
Determine customer’s service time (random integer from 1 to
Begin servicing the customer.
Schedule arrival time of next customer (random integer 1 to
4 added to the current time).
c) For each minute of the day, consider the following:
If the next customer arrives,
Say so,
Enqueue the customer;
Schedule the arrival time of the next customer;
If service was completed for the last customer;
Say so
Dequeue next customer to be serviced
Determine customer’s service completion time
(random integer from 1 to 4 added to the
current time).
Now run your simulation for 720 minutes and answer each of
the following:
a) What is the maximum number of customers in the queue at
any time?
b) What is the longest wait any one customer experiences?
c) What happens if the arrival interval is changed from 1
to 4 minutes to 1 to 3 minutes?

Generalthe client retreive info from the server by pressing a button in java Pinmembermccleon3-Mar-06 7:31 
Generallearning PinmemberProgramgirl27-Jan-06 9:18 
GeneralRe: learning Pinmemberconscript121-Aug-08 4:09 
Generalgetting set up PinmemberProgramgirl27-Jan-06 9:15 
GeneralRe: getting set up PinmemberWiseHacker14-Jun-06 17:17 
GeneralJava call DLL Pinmemberjigneshlakhani9-Jan-06 0:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.141223.1 | Last Updated 11 Sep 2002
Article Copyright 2002 by Irfan Dawood
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid