在SWIG和Visual Studio 2015中使用Java中编译的DLL
Using a compiled DLL in Java with SWIG and Visual Studio 2015
我有一个编译的DLL(C/C++),我必须在Java中使用它。所以我想使用SWIG来创建一个包装器。我遵循了所有的教程,比如:
- 如何使用Visual Studio 2010中的SWIG创建DLL
- http://www.swig.org/Doc3.0/Java.html
- 仅带DLL和声明的SWIG JNI接口
但在所有示例中都没有使用预编译的DLL和/或Java和/或Visual Studio(2015)。当使用自己的cpp文件来实现时(不使用外部DLL来实现头),一切都很好(编译到单个DLL并从Java调用)。
那么我想要什么:有一个预编译的DLL(example.DLL),它的头(example.h)和SWIG头文件(example.I)。将所有内容编译为"包装器DLL",用Java加载此DLL并访问预编译的DLL[example.DLL]。
我的详细步骤:
- 新建VS类库项目
- 添加h和i文件
- 为i文件添加自定义构建步骤(如示例中所示)
- 生成Java文件和example_wrap.cxx文件
- 添加example_wrap.cxx,添加Java includes,不使用预编译头
- 将example_wrap.cxx编译为example.lib(对吗?)
- 像教程中那样设置项目设置(没有clr,添加java includes,没有预编译头)
- 现在创建整个项目失败,示例_wrap.obj中出现链接错误LNK2019
有人能帮我吗?
我也没有得到:结果将是"example.dll"。我必须在Java中使用这个dll(带有System.load/loadLibrary)。这个SWIG dll如何访问"原始"example.dll以及里面的所有逻辑?
使用Python而不是Java会导致相同的失败(LNK2019-未解析的外部符号)。
基本上,您需要将调用"转发"到外部库。也就是说,将符号从那里导入包装器库,并与外部DLL库文件链接。
如果DLL没有这样的库文件,则需要创建它(例如,使用某个工具从DLL创建库),或者在运行时加载外部库/导入符号(LoadLibrary
/GetProcAddress
)。
- 添加example.cpp
- 使用LoadLibrary加载预编译的DLL(例如.DLL)并保存引用
- 使用GetProcAddress从那里加载方法,并为每个方法保存一个引用
- 为每个方法编写一个"implementation",只需调用之前加载的方法
- 编译并将所有内容链接到exampleWrap.dll,并在Java项目中加载此dll
相关文章:
- 尝试用java代码编译和运行c++代码
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- 编译 Java TD 客户端时出现构建错误
- 在为 Java 编译动态链接文件时,我应该选择哪些 g++ 参数
- 使用 C++ 编译和运行 java 文件时无法装入主类
- 在SWIG和Visual Studio 2015中使用Java中编译的DLL
- 在Java(JNI)中与Mingw C 一起编译64位静态LIB
- 如何在Raspberry pi中使用JNI GPIO原生库编译和运行Java程序
- 用java编写源代码,并将其编译为其他语言的各种可执行文件?多重编译
- 使用jni.h在C++中编译java方法时出现构建错误
- 如何编译Java原生库
- 在Java/PHP/Python框架内,在编译的C/C++代码中运行算法
- 通过JNI调用简单的java静态方法是不起作用的,尽管c++编译并运行它
- 我们有没有像c一样用java进行条件编译
- 为什么这个布尔值在 C++ 而不是 Java 中编译
- 使用通配符编译 Java 泛型以C++模板
- 如何使用C++编译.java文件
- 在机器上运行时,编译的源代码(C++、Java 等)涉及哪些安全问题
- 使用 Java 1.5 编译节俭生成的类时出错
- 从 Java 编译 c++ 文件