如何设置JAssimp?

时间:2015-08-30 08:09:38

标签: java c++ dll assimp

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

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

请记住,我没有,但仍然不知道这些命令的含义。无论如何,我不得不安装MinGW,因为我没有使用Linux,因为我在DOS命令中找不到相同的东西。在改变路径以指向他所做的相同位置之后,我的命令看起来像这样:

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&lt; library&gt; ......”当我在考虑如何修改我的命令时,我意识到我错过了一些细节:我甚至试图指出什么是图书馆?好吧,在--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位计算机效率更高,所以我不知道我不想这样做。

1 个答案:

答案 0 :(得分:1)

搞定了。事实证明我使用的是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文件夹来修复此问题。

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