* JNI for C application *
CHelloWorld.java
public class CHelloWorld {
static {
System.loadLibrary("chello");
}
private native void print();
public static void main(String[] args) {
new CHelloWorld().print();
}
}
1. Create a header file for CHelloWorld.javah -jni CHelloWorld
2. Implement CHelloWorld.c
#include <jni.h>
#include <stdio.h>
#include "CHelloWorld.h"
JNIEXPORT void JNICALL
Java_CHelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World from C\n");
return;
}
3. Compile the CHelloWorld.c
gcc -Wall -fPIC -c CHelloWorld.c -I$HOME/jdk1.6.0_22/include \ -I$HOME/jdk1.6.0_22/include/linuxThis will produce the CHelloWorld.o
4. Create a shared library (.so on Linux or .dll on Windows).
gcc -shared -o libchello.so CHelloWorld.o
5. Execute CHelloWorld in Java.
java -Djava.library.path=. CHelloWorldThe -Djava.library.path is required to tell where to load the library from. Alternatively, LD_LIBRARY_PATH (on Linux) or PATH (on Windows) can also be used.
* JNI for C++ application *
public class CppHelloWorld {
static {
System.loadLibrary("cpphello");
}
private native void print();
public static void main(String[] args) {
new CppHelloWorld().print();
}
}
1. Create a header file for CppHelloWorldjavah -jni CppHelloWorld
2. Implement CppHelloWorld.cpp
#include <jni.h>
#include "CppHelloWorld.h"
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL
Java_CppHelloWorld_print(JNIEnv *env, jobject obj)
{
cout << "Hello World from C++" << endl;
return;
}
3. Compile CppHelloWorld
g++ -Wall -fPIC -c CppHelloWorld.cpp -I$HOME/jdk1.6.0_22/include \ -I$HOME/jdk1.6.0_22/include/linuxThis will produce the CppHelloWorld.o
4. Create a shared library (.so on Linux or .dll on Windows)
g++ -shared -o libcpphello.so CppHelloWorld.o
5. Execute CppHelloWorld in Java.
java -Djava.library.path=. CppHelloWorldThe -Djava.library.path is required to tell where to load the library from. Alternatively, LD_LIBRARY_PATH (on Linux) or PATH (on Windows) can also be used.
To call native library in Java using similar concept like Python's ctypes or C#'s P/Invoke, JNA is a good alternative.
No comments:
Post a Comment