环境
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(<ime);
return ctime(<ime);
}
准备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