大約四、五年前吧~ 我記得當時為了將以前用VB寫的定時關機程式要移植到Java版時~ 遇到了一個需要呼叫Windows API的問題~ 這時候透過JNI(Java Native Interface)就不失為一種解決方式~ 當然這樣的方式也就等同於向跨平臺的優勢說bye bye嚕~ 底下是以前所記錄的一些流程步驟(以HelloWorld為範例):
寫一個 HelloWorld.java
class HelloWorld
{
public native void helloworld();
static {
System.loadLibrary("jni");
}
public static void main(String[] args)
{
new HelloWorld().helloworld();
}
}
編譯 HelloWorld.java
javac HelloWorld.java
產生 header file
javah -jni HelloWorld
/* 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: helloworld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_helloworld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
寫一個 jni.c
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_helloworld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
編譯成DLL for Windows
gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -I "C:\Program Files\Java\jdk1.6.0\include" -I "C:\Program Files\Java\jdk1.6.0\include\win32" -shared -o jni.dll jni.c
編譯成SO for Linux
gcc -fPIC -Wall -I/usr/lib/jvm/java-6-sun/include/ -I/usr/lib/jvm/java-6-sun/include/linux -shared -o libjni.so jni.c
呼叫HelloWorld
java HelloWorld
成功!^^
Hello world!