Shared Libraries amb Java
Salta a la navegació
Salta a la cerca
Vull fer l'exemple mínim (HelloWorld) per crear una llibreria compartida (shared library, .so) amb C, i que la pugui utilitzar amb Java.
Aquest és el cas que es dóna amb MidiShare, que està escrit amb C++ però que es pot utilitzar amb Java gràcies a la shared library libJMidi
Segueixo el tutorial http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/stepbystep/index.html
Explicació de Shared Libraries: http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html
Contingut
Step 1: Write the Java Code
HelloWorld.java:
class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } }
Main.java:
class Main { public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } }
Step 2: Compile the Java Code
Ho he fet amb l'Eclipse. En el directori bin/ es crea HelloWorld.class i Main.class
Step 3: Create the .h File
$ cd /home/joan/workspace/Shared_Library/bin/ $ javah -jni HelloWorld
i es crea el fitxer HelloWorld.h:
/* 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: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html #ifdef __cplusplus } #endif #endif
Step 4: Write the Native Method Implementation
HelloWorldImp.c:
#include <jni.h> #include "HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n"); return; }
Creem la shared library:
$ gcc -shared -Wall -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux HelloWorldImp.c -o libhello.so
Step 6: Run the Program
i executem l'aplicació:
$ java -Djava.library.path=/home/joan/workspace/Shared_Library/bin/ Main
creat per Joan Quintana Compte, maig 2009