m-V的函数调用约定,具体可参考——http://www.cocoachina.com/bbs/read.php?tid-66986.html
下面看看汇编源文件(asmtest.s):
.text
.align 2
.globl asmTest
asmTest:
? ? mov? ? ? ? $15, %eax
? ? ret
完成了C源代码以及汇编代码之后,我们将写一个简单的shell文件把它们分别编译,然后再连接成一个so动态共享库文件。
gcc -Wall -c -I/home/zenny_chen/MyPrograms/eclipse/jdk/include -I/home/zenny_chen/MyPrograms/eclipse/jdk/include/linux a.c
gcc -Wall -c asmtest.s
gcc -shared -z noexecstack -o libctest.so a.o asmtest.o
由于jni.h在 jdk/include 下,而jni_md.h则是在 jdk/include/linux 下(其它操作系统则是其它操作系统的名称),因此,这里要把两个头文件包含路径都加上。另外,最后的-z noexecstack要加,因为Java会对栈进行检查,如果没有此连接选项,Java在调用此函数时就会报warning(比较烦人,呼呼~)。最后,连接生成的库名就是libctest.so,这个文件名必须与Java中loadLibrary的库名一致。