学习了swig扩展php后,当然也要试下java了。
c代码及example.i文件不用动。直接进入第三步
3、建立java扩展
swig -java exaple.i
可以看到生成了example.java和exampleJNI.java文件,exampleJNI.java中有类似 public final static native int fact(int jarg1);
这样的语句。即用native关键字来修饰这个方法,表明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL(或so),由java去调用。
native的意思就是通知操作系统,这个函数你必须给我实现,因为我要使用。所以native关键字的函数都是操作系统实现的, java只能调用。
java是跨平台的语言,既然是跨了平台,所付出的代价就是牺牲一些对底层的控制,而java要实现对底层的控制,就需要一些其他语言的帮助,这个就是native的作用了
标识符native可以与所有其它的java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些 实现体是非java的,但是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时,其意义同非Native Method并无差别。
而且native方法不需要方法体,即方法后不需要括号,如:
public final static native int w();
java中的方法修饰符修饰方法时,一定要写在返回类型或者void的前面。
public static viod a(){};正确 public int static a(){}; 错误
4、编译
gcc -fpic -c example.c example_wrap.c -I/usr/java/j2sdk1.4.2/include -I/usr/java/j2sdk1.4.2/include/linux
这两个-I应该是java安装路径下的include和include/linux 包含jni.h的
gcc -shared example.o example_wrap.o -o libexample.so
5、使用
vim main.java
public class main {
public static void main(String argv[]) {
System.loadLibrary("example");
System.out.println(example.getMy_variable());
System.out.println(example.fact(5));
System.out.println(example.get_time());
}
}
javac main.java
java main
怎么样?也出结果了吧?什么?
Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path?
那么看看LD_LIBRARY_PATH是否有问题?得把libexample.so放到LD_LIBRARY_PATH中,或是改下这个环境变量的值就可以了。