为什么我的方法抛出`UnsatisfiedLinkError`?

时间:2017-10-19 13:29:10

标签: java c++ java-native-interface mingw32 mingw-w64

我有一个带有一些JNI的项目,里面有一个makefile,用于在Windows 10 64位下编译dll。对于软件约束,我需要为32位JRE编译dll库。

我的makefile如下:

CC32=C:\i686-w64-mingw32-gcc\bin\i686-w64-mingw32-g++.exe
CC64=C:\Program\ Files\mingw-w64\x86_64-6.2.0-win32-seh-rt_v5-rev1\mingw64\bin\g++.exe

all: LibJNI32.dll LibJNI64.dll

LibJNI32.dll: LibJNI.cpp LibJNI.h
    ${CC32} -shared -o $@ $< -mtune=generic -m32 -std=gnu++11 -O2 \
    -I. -IC:\Program\ Files\ (x86)\Java\jdk1.8.0_151\include -IC:\Program\ Files\ (x86)\Java\jdk1.8.0_151\include\win32

LibJNI64.dll: LibJNI.cpp LibJNI.h
    ${CC64} -shared -o $@ $< -mtune=generic -fPIC -m64 -std=gnu++11 -O2 \
    -I. -IC:\Program\ Files\Java\jdk1.8.0_121\include -IC:\Program\ Files\Java\jdk1.8.0_121\include\win32

LibJNI.h: LibJNI.java
    javah -o LibJNI.h -cp ../java my.package.LibJNI

虽然我的java程序可以很好地加载LibJNI32.dllLibJNI64.dll,但只能使用LibJNI64.dll调用jni。那些LibJNI32.dll会抛出UnsatifiedLinkError

我的makefile是否缺少编译好32位的东西?

2 个答案:

答案 0 :(得分:0)

如果您使用32/64位库,则在共享公共系统库时可能会遇到困难:

  • 确保在PATH上放置32位库(你的DLL所依赖的库)
  • 制作一个简单的包装器代码并仔细检查您的DLL是否在JVM外部工作

答案 1 :(得分:0)

好的,我终于找到了解决方案: Java JNI native library loads on 64bit and 32bit, but doesn't run on 32bit [SOLVED]

解决方案是对{32} dll目标使用-Wl,--kill-at编译器标志。