In this tutorial we'll be creating a Java application calling code from
a native library. We'll have a Java application called HelloWorld which will
call the function First off, we'll create a file named /* HelloWorld.java */ public class HelloWorld { native void helloFromC(); /* (1) */ static { System.loadLibrary("ctest"); /* (2) */ } static public void main(String argv[]) { HelloWorld helloWorld = new HelloWorld(); helloWorld.helloFromC(); /* (3) */ } }
Even though we didn't write any library yet, we can still compile the Java application, because this is a dependency that will be resolved at runtime. So, let's compile the application: javac HelloWorld.java This will generate a java HelloWorld Exception in thread "main" java.lang.UnsatisfiedLinkError: no ctest in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1754) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1045) at HelloWorld.(HelloWorld.java:6) Alright, let's now start writing the javah HelloWorld This command will generate a HelloWorld.h file in the same directory, containing the following code: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: helloFromC * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_helloFromC (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif We'll leave this file exactly as is, as the comment suggests, but we need to
copy the function definition. Copy the definition and put it in a new file,
named /* ctest.c */ JNIEXPORT void JNICALL Java_HelloWorld_helloFromC (JNIEnv * env, jobject jobj) { } Note that we gave names to the parameters. Now let's implement the function.
Aside from our own includes, we also need to include /* ctest.c */ #include <jni.h> #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_helloFromC (JNIEnv * env, jobject jobj) { printf("Hello from C!\n"); } Now that we have the file, let's compile it and create a native library. This
part is system dependent, but the only things that change really are the
extension of the generated library file and the path to the gcc -o libctest.so -shared -I/path/to/jdk/headers ctest.c -lc Replace Once you successfully run the above command, you will see a To see this in action, run the application: java HelloWorld If everything works correctly, you should see: Hello from C! |
|