为什么甚至编译? - 使用swig生成的类

时间:2017-10-30 22:16:04

标签: java linux java-native-interface shared-libraries swig

所以我按照this Swig教程生成了JNI代理类和共享库。结果我得到了libexmple.so文件。

构建Java模块教程部分,您可以看到。

 $ swig -java example.i
 $ gcc -c example.c example_wrap.c -I/c/jdk1.3.1/include -I/c/jdk1.3.1/include/win32
 $ gcc -shared example.o  example_wrap.o -mno-cygwin -Wl,--add-stdcall-alias  -o example.dll
 $ cat 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
 3.0
 120
 Mon Mar  4 18:20:31  2002

3.0,120和Mon Mar 4 18:20:31 2002是功能结果。

老实说,我甚至没想到要编译,但是当我做java main时,它确实和它运行没有问题所以我的一个问题是? java如何知道println方法调用中的“示例”

System.out.println(example.getMy_variable());

当我尝试编译thourgh Intellij IDE时,天生就会抛出一个错误 “找不到符号的例子”,因为我应该抛出。

当我尝试以这种方式使用此库时

public class Main {

static {
    try {
        System.loadLibrary("example");
        System.out.println("lib initialized");
    } catch (Exception e) {
        System.out.println(e.toString());
    }

}

public static native void My_variable_set(double jarg1);

public static native double My_variable_get();

public static native int fact(int jarg1);

public static native int my_mod(int jarg1, int jarg2);

public static native String get_time();

public static void main(String args[]) {
    try {
        Main.fact(3);
        System.out.println("method called successfully");
    } catch (Exception e) {
        System.out.println(e.toString());
    }

}

我正在

Exception in thread "main" java.lang.UnsatisfiedLinkError: test.Main.fact(I)I

尝试调用本机方法时。

我确信lib已正确加载(获取lib初始化日志)。当我尝试加载非存在时,我得到了不同的错误(类加载异常)

java.lang.UnsatisfiedLinkError: no exampleld in java.library.path

1 个答案:

答案 0 :(得分:1)

为什么要编译?

因为 javac 可以看到使用来自同一的类示例,并进行编译。实际上,它还找到了类 exampleJNI ,它也是由 swig 自动生成的,并在 example.java 中使用。

java如何知道"示例"是在println方法调用吗?

在Java中,对于位于同一个程序包中的类,您不需要 import ,这是 java 所知道的调用 example.getMy_variable()

当我尝试使用这个库时,我得到了异常

您尝试将本机方法从 exampleJNI.java 移至 main.java 失败,因为使用JNI时,类的名称用于确定名称本机功能。如果查看 example.dll 的导出函数列表,可以看到它。

如果您想使用 swig ,只需使用它生成的文件即可。如果您想更好地了解JNI的工作原理,请阅读书籍或在线文档,按照教程等进行操作。不要尝试使用 swig 来实现它不是:JNI编程简介。