SWIG扩展java

来源:互联网 发布:苹果电脑安装mac系统 编辑:程序博客网 时间:2024/06/05 13:20

学习了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标识符连用时,其意义同非NativeMethod并无差别。

而且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中,或是改下这个环境变量的值就可以了。
原创粉丝点击