ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年12月3日 星期一

java native interface : jni

Java call c function 的歸定。
就是在 C 寫 function 讓 java call

要作 java call C function ,有兩種方法:
  • 利用javah 產生的 header,實做 c function 。 -- 這是用 java vm 的標準 mapping 方式
  • 自己在 c function 寫 JNI_OnLoad( ), 在裡面寫明 mapping 方式。

ref:
  • http://www.xyplot.com/jni.simple.htm
  • http://hi.baidu.com/jfojfo/item/1011ac02d8e0cd813d42e27b
  • http://en.wikipedia.org/wiki/Java_Native_Interface


第一種方法,javah, 標準方式

在 Wiki 寫得很清楚,有嚴格的function name , argument mapping 的規定,
甚至 c 的 header file 都是由 java toolchain 產生的。

可以follow wiki 的 example 作法。

步驟是
  • 先寫 java code,c 的function 要加上 native
  • 用 javac compile 出 class
  • 用 javah 從 class 產生 c 的 header
  • follow c header,新開一個 c source, implement function
  • 用 gcc compile c files


照著作時發生兩個問題:

1. compile c code 時,出現 error
error: jni_md.h: No such file or directory
這個google 一下就可以知道,是 jni_md.h 的位置,是在 include/linux 下,不是 include 下,所以把 include/linux 也加到 include path 就可以。

gcc -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -shared libHelloWorld.c -o libHelloWorls.so
然後是..

2.-fPIC

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
解決方法就和 error 的說明一樣,compile option 加 -fPIC就可以:
gcc -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -shared libHelloWorld.c -o libHelloWorld.so 這樣就可以了。

沒有留言:

標籤

網誌存檔