blog.Ring.idv.tw

用Java來和C做溝通的介面 - JNI

用Java來和C做溝通的介面 - JNI


大約四、五年前吧~ 我記得當時為了將以前用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!

2007-12-24 20:42:12

3 comments on "用Java來和C做溝通的介面 - JNI"

  1. 1. Sandra 說:

    請問在"編譯成DLL"這部分使用到的gcc指令需要安裝什麼軟體程式嗎?
    我在命令列輸入這一串指令後,系統回應'gcc'不是內部或外部命令、可執行的程式或批次檔。

    2011-09-15 17:27:44

  2. 2. Shen 說:

    請參考MinGW: http://www.mingw.org/wiki/InstallationHOWTOforMinGW

    2011-09-15 23:54:51

  3. 3. Damon 說:

    請問一下
    執行:javah -jni HelloWorld
    結果:
    error: cannot access HelloWorld
    class file for HelloWorld not found
    javadoc: error - Class HelloWorld not found.
    Error: No classes were specified on the command line. Try -help.

    已經產生class檔了,到底是哪裡出了問題呢?

    2011-11-13 14:25:20

Leave a Comment

Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment

::: 人氣指數 :::

今日人氣:165

累積人氣:3003630


::: 線上人數 :::

counter