最近在練習 JNI 的東西遇到一些挫折,特此紀錄一下

有關 JNI 的介紹以下網站可供參考

http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

 

首先是在 Linux 上怎麼樣都跑不起來,於是我流下了淚水,屈辱地放棄了

(一直跳出這些訊息不知道在衝三小朋友)

/usr/bin/ld: /tmp/ccUKEY89.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

/usr/bin/ld: unrecognized option '--add-stdcall-alias'
/usr/bin/ld: use the --help option for usage information
collect2: ld returned 1 exit status

 

然後轉戰 Windows 7

程式碼很簡單,先寫一個 HelloJNI.java

public class HelloJNI {
    static {
        System.loadLibrary("hello"); // Load native library at runtime hello.dll (Windows) or libhello.so (Unixes)
    }

    // Declare a native method sayHello() that receives nothing and returns void
    private native void sayHello();

    // Test Driver
    public static void main(String[] args) {
        new HelloJNI().sayHello(); // invoke the native method
    }
}

裡面做的事就是調用一個用 native code 寫的動態連結檔來印出 Hello World

 

編譯方式:

javac HelloJNI.java
javah HelloJNI

執行 javah 後會生成一個 HelloJNI.h,這個是等會要從 native 編譯用的,不用管它。

 

再來寫一個 HelloJNI.c

#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"

// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
    printf("Hello World!\n");
    return;
}

夠簡單吧,注意function 的回傳值和檔名有既定的格式

 

耶,寫完來編譯了,在 windows  上需要下載 windows 版的 gcc,也就是 MinGW (http://www.mingw.org/)

這裡很重要,必須要下載 32bit & 64 bit 版本,不然等等會吐血

http://sourceforge.net/projects/mingw-w64/files/latest/download?source=files

 

安裝完後把 MinGW 的 bin folder 加入 Path 中,就可以在 cmd 中使用 gcc 編譯惹~

gcc -m64 -c -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" HelloJNI.c
gcc -Wl,--add-stdcall-alias -shared -o hello.dll HelloJNI.o

-m64 很重要一定要加一定要加一定要加一定要加

不然執行時會出現

hello.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

或 HelloJNI.c:1: sorry, unimplemented: 64-bit mode not compiled in 

 

dll 檔編譯完成後利用 java 執行程式

java HelloJNI

Hello World!

 

喔耶!從此印 Hello world 的 performance 加倍,真是幹你娘。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 擒猿小舖 的頭像
    擒猿小舖

    擒猿小舖

    擒猿小舖 發表在 痞客邦 留言(0) 人氣()