java - 如何设置JAssimp?

标签 java c++ dll assimp

Assimp是用于将3D模型导入到您的应用程序中的库。它是为C++编写的,但是有一个名为jassimp的java端口。在过去的5到6个小时里,我一直在尝试在Eclipse中设置jassimp,但无法使其正常工作。我下载了assimp here的win-binaries版本,其中还包括jassimp的移植版本。现在,我将发布为使jassimp正常运行所采取的步骤,以希望有人能够识别错误。

我主要遵循here所示的“教程”,它基本上由“如何构建”下的两部分组成。

请记住,我曾经也仍然不真正知道这些命令的含义。无论如何,由于我没有使用Linux,并且因为我在DOS命令中找不到等效项,所以我不得不安装MinGW。更改路径以指向他所做的相同位置后,我的命令如下所示:

gcc jassimp.cpp -I "C:/Program Files/java/jdk1.8.0/include" -I "C:/Program Files/java/jdk1.8.0/include/win32" -lassimp -shared -fPIC -o libjassimp.so

我运行了它,但是遇到了一个问题:
jassimp.cpp:3:28: fatal error: assimp/cimport.h: No such file or directory
 #include <assimp/cimport.h>

“好吧。”我想。 “好吧,那些-I命令可能包含文件或其他内容,因此也许我应该寻找丢失的头文件并通过-I包含它!”因此,我在jassimp文件夹中查找了“cimport.h”文件,您知道吗,我在一个名为include的文件夹中找到了它。然后我将命令更改为
gcc jassimp.cpp -I "C:/Program Files/java/jdk1.8.0/include" -I "C:/Program Files/java/jdk1.8.0/include/win32" (new->)-I "C:/assimp-3.1.1-win-binaries/include/"(<-new) -lassimp -shared -fPIC -o libjassimp.so

运行它后,我很惊讶地看到另一个错误:
C:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lassimp

“嗯……”我想。经过一番谷歌搜索后,我发现this answer。因此,我继续做他做的事情,奇怪的是,我看到它正在随机文件夹中寻找名为libassimp.dll,assimp.dll.a,libassimp.a等的文件。“嘿,您不应在这些文件夹中查找!”我尖叫。

“那么我怎样才能在正确的位置看到它呢?”我想知道幸运的是,我找到了this答案。 “嗯...他放了-L,然后放了他的库,然后放了-l <库> ...”。当我在考虑如何修改命令时,我意识到我缺少了一些细节:我什至要指向的库是什么?好了,在--verbose命令中,它看起来像是一个文件名为assimp.lib或assimp.dll的文件。因此,我搜索了jassimp文件夹,希望找到一个类似的文件。我在名为bin64的文件夹中找到一个名为assimp.dll的文件夹。然后,我再次更改了命令:
gcc jassimp.cpp -I "C:/Program Files/java/jdk1.8.0/include" -I "C:/Program Files/java/jdk1.8.0/include/win32" -I "C:/assimp-3.1.1-win-binaries/include/" (new->)-L "C:/assimp-3.1.1-win-binaries/bin64"(<-new) -lassimp -shared -fPIC -o libjassimp.so

运行它给我这个错误:
C:/assimp-3.1.1-win-binaries/bin64/assimp.dll: file not recognized: File format not recognized

因此,我决定构建assimp,就好像我将其用于c++一样,以便希望获得功能性的.dll文件(我真是拼死了...)。我按照此(http://assimp.sourceforge.net/lib_html/cmake_build.html)教程进行了构建,该教程使用CMake。最终,我使用CMake构建了该项目,该项目显然只是将其设置为在Visual Studio中使用,在Visual Studio 2013中将其打开,然后从那里构建它的发行版。这给了我一个.dll文件,然后我将命令更改为指向:
gcc jassimp.cpp -I "C:/Program Files/java/jdk1.8.0/include" -I "C:/Program Files/java/jdk1.8.0/include/win32" -I "C:assimp-3.1.1-win-binaries/include/" (new->)-L "C:/assimp build/code/Release/"(<-new) -lassimp -shared -fPIC -o libjassimp.so

好吧,至少它给了我一个不同的错误:
C:\Users\Nick\AppData\Local\Temp\ccgtrCg8.o:jassimp.cpp:(.eh_frame$_ZN7JNIEnv_9NewObjectEP7_jclassP10_jmethodIDz+0x13): undefined reference to `__gxx_personality_v0'
C:\Users\Nick\AppData\Local\Temp\ccgtrCg8.o:jassimp.cpp:(.eh_frame+0x14b): undefined reference to `__gxx_personality_v0'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\Nick\AppData\Local\Temp\ccgtrCg8.o: bad reloc address 0x14b in section `.eh_frame'

用Google搜索它,然后将gcc更改为g++,然后瞧瞧,我得到了一个名为libjassimp.so的文件。第1部分完成。还是我想。

第2部分的时间相对比较容易,所以我只想说我成功地得到了jassimp.jar文件。

是时候将所有内容放到我的Eclipse项目中了,其中包括我将jar文件添加到构建路径,并将libjassimp.so附加到jar的本地位置。尝试使用jassimp中的一种类后,我遇到了这个小家伙:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jassimp in java.library.path

我不想在接下来的部分中解释我的思考过程,总而言之,我在命令中这样更改了输出文件名:


-o libjassimp.so


-o jassimp.dll

天才吧?使用新的本机文件运行它,现在我陷入其中:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\MyName\workspace\jassimp\lib\native\jassimp.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

Google说使用-m64会将.dll编译为64位,因此我尝试了
g++ jassimp.cpp ... -m64 -o jassimp.dll

而且,并不奇怪,在尝试从命令行进行编译时出现了此错误:
jassimp.cpp:1:0: sorry, unimplemented: 64-bit mode not compiled in

如果我在任何地方搞砸了,我将不得不猜测是在将名称输出文件从.so更改为.dll的时候,但是我不知道该怎么办。我也可能在其他地方搞砸了。

无论如何,我被困住了,老实说我不知道​​我还能在这里做什么。关于该主题的帖子似乎没有很多,但是似乎其他人已经使它起作用了,我对此感到震惊,因为除了我的以外,我不知道他们可以采取的其他任何流程。我已经读过一种解决方案,它使用32位jvm / jdk / jre /什么,但是我读到64位计算机比32位计算机效率更高,所以我不想这样做。

最佳答案

得到它的工作。原来我使用的是32位版本的MinGW,这就是为什么我要编译32位.dll的原因。我也不需要使用CMake或Visual Studio构建assimp:我可以简单地使用win-binaries assimp文件夹中的assimp.lib和assimp.dll文件。最终命令在这里:

g++ jassimp.cpp -I "C:/Program Files/java/jdk1.8.0/include" -I "C:/Program Files/java/jdk1.8.0/include/win32" -I "C:/Users/Nick/Desktop/java libraries/assimp-3.1.1-win-binaries/include/" -L "C:/Users/Nick/Desktop/java libraries/assimp-3.1.1-win-binaries/bin64" -L "C:/Users/Nick/Desktop/java libraries/assimp-3.1.1-win-binaries/lib64" -lassimp -shared -fPIC -o -m64 jassimp.dll

-m64是不必要的,但我将其放置在此处只是为了确保dll编译为64位。另外,当我在Eclipse中使用新的jassimp.dll时,出现了一个不满意的链接错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\MyName\workspace\myproject\lib\jassimp-native\jassimp.dll: Can't find dependent libraries

我通过将assimp-3.1.1-win-binaries / bin64中的assimp.dll文件放到system32文件夹中来解决此问题。

希望这对某人有帮助。
如果您有任何疑问,请随时提问。

关于java - 如何设置JAssimp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32294531/

相关文章:

java - 在 linux 中使用 JNI 和 C++ 加载动态库

c++ - 在具有不同 CRT 的库中使用 shared_ptr<T>

c# - 如何修复 'IdentityModel.dll not found' ?

java - 在 selenium 服务器上独立运行从 selenium ide 生成的 java 导出测试

java - 对文件进行Base64编码并压缩

java - 尝试通过 php webservice 发送数组时出现异常

java - Android AudioTrack.write 返回 -4

c++ - 应该在哪里声明纯虚析构函数?

c++ - 在 C++ 中解析 main 函数的大量输入的正确方法是什么

c++ - 加载时动态链接库调度