linux 下 swig 将c代码包装成java

环境

ubuntu linux

swig 4.0.2

gcc 9.3.0

jdk jdk1.8.0_321

准备example.c 文件

$ vi example.c
#include <time.h>
double My_variable = 3.0;

int fact(int n){
    if (n <=1) return 1;
    else return n*fact(n-1);
}

int my_mod(int x, int y){
    return (x%y);
}

char *get_time(){
    time_t ltime;
    time(&ltime);
    return ctime(&ltime);
}

准备example.i文件

$ vi example.i
%module example
%{
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
$ swig -java example.i
$ locate jni.h
/home/mike/.local/share/Trash/files/jdk/jdk1.8.0_321/include/jni.h
/usr/java/jdk1.8.0_321/include/jni.h

$ locate jni_md.h
/home/mike/.local/share/Trash/files/jdk/jdk1.8.0_321/include/linux/jni_md.h
/usr/java/jdk1.8.0_321/include/linux/jni_md.h
$ gcc -fpic -c example.c example_wrap.c -I/usr/java/jdk1.8.0_321/include/ -I/usr/java/jdk1.8.0_321/include/linux/
$ gcc -shared example.o  example_wrap.o -o libexample.so
$ vi 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
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
    at java.lang.Runtime.loadLibrary0(Runtime.java:871)
    at java.lang.System.loadLibrary(System.java:1124)
    at main.main(main.java:3)
$ java -Djava.library.path=. main
3.0
120
Wed Feb 16 11:56:39 2022
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容