Java 不会从使用 swig 创建的.dll调用函数
Java won't call the functions from the .dll created using swig
我使用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 程序员来说似乎是最自然的。
相关文章:
- 函数指针分配在创建 DLL 后导致错误
- 无法创建 DLL:获取 DLL "is not a valid Win32 application"
- 如何从支持linux/mac操作系统的第三方代码为我的c#项目创建dll
- 在 c++ 中创建 dll 并在 delphi 中调用的标准方法
- Windows错误:异常:使用从C++到Python的ctypes创建DLL时出现访问冲突或Windows错误193
- 如何从标头和库创建 DLL
- 如何在 c++ 生成器 6 中从应用程序源代码创建 dll
- 使用VCPKG下载依赖项而无需创建DLL
- 在运行时用c++创建dll
- 使用 C++ 创建 DLL 文件
- 使用不同的C++环境创建DLL
- 使用Cygwin创建DLL时
- 从 C# 调用C++代码而不创建 dll
- 创建DLL导出对象时发生堆栈溢出错误
- 在C++中创建DLL以在VS2005中导入C++DLL
- 正在用现有代码创建.dll
- r语言 - 在 Windows 上使用 Rcpp 创建.dll文件并编译C++代码
- 创建 Dll 文件
- Winbase.h 不支持创建 DLL 文件
- 从现有 mfc 项目创建 dll