Q

Using Java to call a Linux C program from Windows

I have written a C program on the Linux platform. I want a Java interface so that I can access it from my Windows workstation. I know some Java Swing GUIs but don't know how I can call or invoke a C program. Any advice?
To access a C program from Java you need to use the Java Native Interface (JNI) subsystem. The JNI subsystem handles the interactions between Java classes and non-Java libraries.

To use a native library from the JNI subsystem, you must:
A) Prototype the native routines, rebuild the library and place it in the JDK's runtime path
B) Implement Java-to-C and C-to-Java data conversions
C) Load the library from Java using the System.loadLibrary method
D) Declare the native routines to Java

The following example demonstrates JNI prototypes for C routines:
JNIEXPORT void JNICALL Java_MyJavaClass_myNativeRoutine
  (JNIEnv *, jclass, jstring);

JNIEXPORT jboolean JNICALL
Java_MyJavaClass_myNextNativeRoutine
  (JNIEnv *, jclass);
The following example demonstrates a conversion from a Java String to a C string:
JNIEXPORT jboolean JNICALL Java_MyJavaClass_myNativeRoutine
  ( JNIEnv *env, jobject obj, jstring jParam)
{
   /* convert the Java String param */
   const char *cParam = (*env)->GetStringUTFChars(env,
jParam, 0);

   /* use the string */
   makeAnActualNativeCall(cParam);

   /* free the memory used by the C string */
   (*env)->ReleaseStringUTFChars(env, jParam,
cParam);                           }

A complete list of data-type conversions and their usage can be found at: http://java.sun.com/j2se/1.3/docs/guide/jni/index.html

The following example demonstrates the loadLibrary method and examples of native routine declarations:
class MyJavaClass
{                                                           
 
   static
  
{                                                           
        
      try
      {
         // load the native
library                                                     
           
        
System.loadLibrary"mylibrary");                             
   
      }                                                     
               
      catch( UnsatisfiedLinkError e)
      {                                     
         System.out.println("Error loading native library");
      }                                                     
   }

   // declare the native routines
   public static native void myNativeRoutine(String aParam);
   public static native boolean myNextNativeRoutine();
}
Once the library is loaded, you can make calls to-and-from Java and the native library.
This was first published in February 2004

Dig deeper on Java Web Services

Pro+

Features

Enjoy the benefits of Pro+ membership, learn more and join.

Have a question for an expert?

Please add a title for your question

Get answers from a TechTarget expert on whatever's puzzling you.

You will be able to add details on the next page.

0 comments

Oldest 

Forgot Password?

No problem! Submit your e-mail address below. We'll send you an email containing your password.

Your password has been sent to:

-ADS BY GOOGLE

SearchSoftwareQuality

SearchCloudApplications

SearchAWS

TheServerSide

SearchWinDevelopment

Close