Java 不会从使用 swig 创建的.dll调用函数

Java won't call the functions from the .dll created using swig

本文关键字:创建 dll 调用 函数 swig Java      更新时间:2023-10-16

我使用swig和cmake为java创建了动态库,用于学习目的。我无法从我创建的同一库中调用 java 中的函数。swig 文档告诉我这是忘记编译并将 swig 包装器文件链接到我的本机库的结果,但我非常确定我用 cmake build 做到了这一点。

CMakeList.txt

cmake_minimum_required (VERSION 2.6)
FIND_PACKAGE(SWIG REQUIRED)
find_package(Java REQUIRED COMPONENTS Runtime Development)
find_package(JNI REQUIRED)
INCLUDE(${SWIG_USE_FILE})
set(JAVA ${java_include_path} )
INCLUDE_DIRECTORIES(${JAVA} ${JAVA}/win32)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
SET_SOURCE_FILES_PROPERTIES(hello.i PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES(hello.i PROPERTIES SWIG_FLAGS "-includeall")
SWIG_ADD_MODULE(hello java hello.i  hello.cpp)
SWIG_LINK_LIBRARIES(hello ${Java_LIBRARIES} ${JNI_LIBRARIES} ${CMAKE_CURRENT_SOURCE_DIR})

你好.cpp

#include "hello.hpp"
int adding(const int x, const int y)
{
  return y + x;
}

你好.hpp

int adding(const int x, const int y);

你好.i

 %module hello
 %{
   #include "hello.hpp"
 %}
int adding(const int x, const int y);

谁能告诉我在创建动态库时我做错了什么?感谢您的帮助。

我知道这是由于日食中的此错误消息

Exception in thread "main" java.lang.UnsatisfiedLinkError: hello.helloJNI.adding(II)I
    at hello.helloJNI.adding(Native Method)
    at hello.hello.adding(hello.java:14)
    at hello.Main.main(Main.java:14)

这与文档谈论的错误消息相同。

错误消息中缺少的符号是 JNI 包装器的一部分,而不是库本身的一部分。

通常,这意味着在首次调用 SWIG 模块的本机部分之前,您尚未调用 SWIG 模块的本机部分的System.loadLibrary()。您的 CMake 文件看起来已正确链接实现,因此这不是您从文档中引用的错误情况。

以及手动调用:

System.loadLibrary("hello"); // The name of your DLL here

从您的main方法中,当我面向 Java 时,我喜欢在我的 SWIG 接口文件中使用以下方法:

%pragma(java) jniclasscode=%{
  static {
    try {
        System.loadLibrary("hello"); // The name of your DLL here
    } catch (UnsatisfiedLinkError e) {
      System.err.println("Native code library failed to load. n" + e);
      System.exit(1);
    }
  }
%}

这会导致本机库在需要之前自动加载,这对 Java 程序员来说似乎是最自然的。