繁体   English   中英

无法在 AMD 64 位平台上加载 IA 32 位 .dll

[英]Can't load IA 32-bit .dll on a AMD 64-bit platform

我正在尝试使用 Java 中的SVMLight ,使用此页面上JNI 包装器

  static {
    System.loadLibrary("lib/JNI_SVM-light-6.01/lib/svmlight");
  }

我收到以下错误:

... lib\\JNI_SVM-light-6.01\\lib\\svmlight.dll:无法在 AMD 64 位平台上加载 IA 32 位 .dll

我可以通过重新编译 64 位的 .dll 来解决这个问题吗? 我该怎么做呢? 我可以使用其他一些解决方法吗? SVMLight 使 C 源代码可用。

是的,您必须为 64 位重新编译 DLL。 您唯一的其他选择是切换到 32 位 JVM,或者让一些 32 位进程代表您加载 DLL 并以某种方式与该进程通信。

我在使用最初打算在 Win XP 上运行的 tibco dll 的 Java 应用程序中遇到了同样的问题。 为了让它在 Windows 7 上运行,我将应用程序指向 32 位 JRE。 等待看看是否有其他解决方案。

第一个问题的简短回答:是的。

更长的答案:也许; 这取决于 SVMLight 的构建过程是否在 64 位 Windows 上运行。

最后一点:对 System.loadLibrary 的调用是愚蠢的。 要么使用完整路径名调用 System.load,要么让它搜索 java.library.path。

在 win64bit 和 JVM 64bit 中有同样的问题

已通过将dll上传到system32解决

确保您将 PATH 设置为Program Files (x86)而不是Program Files 那解决了我的问题。

来自 - http://blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically/

如果设置java.library.path,需要有以下几行才能工作。

Field fieldSysPath;
fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );

项目属性 >> 运行 >> VM 选项

并把这个地址:

-Djava.library.path="C:\opencv\build\java\x64"

只需去安装下载jdk_x86并将其安装在 Program Files (x86) 中并在您的项目中设置 jre 路径。 而已。

在以前在 Windows x32 下运行的 Windows x64 上运行 red5(tomcat) 时遇到问题,出现下一个错误:

 INFO pool-15-thread-1 com.home.launcher.CommandLauncher - Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\....\lib\Data Samolet.dll: Can't find dependent libraries
INFO pool-15-thread-1 com.home.launcher.CommandLauncher - at java.lang.ClassLoader$NativeLibrary.load(Native Method)

当我安装 Java x32 版本并设置 next 时问题解决了

“环境变量”

“家庭用户变量”

JAVA_HOME => C:\\Program Files (x86)\\Java\\jdk.1.6.0_45

“系统变量”

路径[开头] => C:\\Program Files\\Java\\jdk.1.8.0_60;...

我有一个与此相关的问题,正在阅读

"Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\opencv\build\java\x86\opencv_java2413.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform "

我花了整晚才弄明白。

我通过将C:\\opencv\\build\\java\\x64的 dll 复制到我的 system32 文件夹解决了我的问题。 我希望这会对某人有所帮助。

这是从命令行/命令提示符编译的人的答案。 它不需要更改您的Path环境变量; 它只是让您将 32 位JVM用于带有 32 位DLL

对于编译,使用哪个javac无关紧要 - 32 位或 64 位。

>javac MyProgramWith32BitNativeLib.java

对于程序的实际执行,指定java.exe 32位版本的路径重要

我将为Windows发布一个代码示例,因为这似乎是 OP 使用的操作系统。

视窗

最有可能的代码类似于:

>"C:\Program Files (x86)\Java\jre#.#.#_###\bin\java.exe" MyProgramWith32BitNativeLib 

不同之处在于jre之后的数字。 要查找您应该使用的数字,请输入:

>dir "C:\Program Files (x86)\Java\"

在我的机器上,过程如下

C:\Users\me\MyProject>dir "C:\Program Files (x86)\Java"
 Volume in drive C is Windows
 Volume Serial Number is 0000-9999

 Directory of C:\Program Files (x86)\Java

11/03/2016  09:07 PM    <DIR>          .
11/03/2016  09:07 PM    <DIR>          ..
11/03/2016  09:07 PM    <DIR>          jre1.8.0_111
               0 File(s)              0 bytes
               3 Dir(s)  107,641,901,056 bytes free

C:\Users\me\MyProject>

所以我知道我的数字是1.8.0_111 ,我的命令是

C:\Users\me\MyProject>"C:\Program Files (x86)\Java\jre1.8.0_111\bin\java.exe" MyProgramWith32BitNativeLib

不用担心,您应该将本机库中的 .dll 从 x64 更改为 x86。

例如:- 您可能选择了这个 (C:\\opencv\\build\\java\\x64)。

相反,您为本机库(C:\\opencv\\build\\java\\x86)选择了这个。

我的 Windows 笔记本电脑同时拥有 32 位和 64 位客户端,我突然开始面对,然后我重新排序了路径变量,如下所示

前:

C:\app\oracle64\product\12.1.0\client_1\bin;
C:\app\oracle32\product\12.1.0\client_1\bin;

后:

C:\app\oracle32\product\12.1.0\client_1\bin;
C:\app\oracle64\product\12.1.0\client_1\bin;

开始工作...希望这对大家有帮助。

对于您的本机库位置,请使用 X64 而不是 X86。 至少我遇到了这个固定的问题。

不需要为 Win64 构建。

https://tomcat.apache.org/download-native.cgi上下载 64x 版本

从其中一个镜子,即

https://mirror.checkdomain.de/apache/tomcat/tomcat-connectors/native/1.2.28/binaries/tomcat-native-1.2.28-openssl-1.1.1k-win32-bin.zip

从 zip 使用:

bin\\x64\\tcnative-1.dll

我遇到了同样的问题,@Daniel Pryden 是对的,我都尝试过,并且转移到 32 位 JVM 对我有用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM