就是在 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
這樣就可以了。
沒有留言:
張貼留言