對於最近找關於Android資料的我看過很多次,但就是不知道JNI到底是什麼

甚至在摸索NDK時,所建立的第一個NDK範例Project,檔名也有jni

這邊特地找了下資料整理起來,希望自己能對JNI多了解。

簡單來說JNI即是JAVA用來跟C/C++等其他語言溝通的函式庫。

實作一個簡單的jni程式,由於我是在windows環境實作,因此跟在Linux有些許不同

1.建立 HelloWorld.java

class HelloWorld
{
public native void helloworld();

static {
System.loadLibrary("jni");
}


public static void main(String[] args)
{
new HelloWorld().helloworld();
}
}

2. 在命令提示字元,也就是dos畫面下指令,產生class檔案

javac HellWorld.java

3. 下指令,產生 Header file

javah -jni HelloWorld

4.建立 jni.c

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


JNIEXPORT void JNICALL 
Java_HelloWorld_helloworld(JNIEnv *env,jobject obj)
{
printf("this is so drifferent!\n");
return;
}

5. 下指令,產生dll檔案

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

"C:\Program Files\Java\jdk1.6.0\include" 為 jni.h的路徑

C:\Program Files\Java\jdk1.6.0\include\win32 為jni_md.h的路徑

在這裡搞了很久,因為我一直產生.so檔,但在Windows環境下要產生的事dll檔案

不同於Windows輸入上述指令

gcc -fPIC -shared -I/usr/local/jdk1.6.0_23/include -I/usr/local/jdk1.6.0_23/include/linux jni.c -o libjni.so

同理第一個路徑/usr/local/jdk1.6.0_23/include為jni.h的路徑

但在編譯時總是遇到fPIC錯誤,後來才知道原來上述指令為在Linux環境下達的指令

最後成功編譯出dll檔案

 

6.執行 HelloWorld

java HelloWorld

 

參考網址

http://blog.ring.idv.tw/comment.ser?i=127

http://cheng-min-i-taiwan.blogspot.com/2011/04/java-native-interface-jni.html



arrow
arrow
    全站熱搜

    glitterHsin 發表在 痞客邦 留言(0) 人氣()