【问题标题】:Why my method throws an `UnsatisfiedLinkError`?为什么我的方法会抛出“UnsatisfiedLinkError”?
【发布时间】:2017-10-19 13:29:10
【问题描述】:

我有一个包含一些 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

虽然LibJNI32.dllLibJNI64.dll 都被我的java 程序很好地加载了,但只能使用LibJNI64.dll 调用jni。那些LibJNI32.dll 抛出一个UnsatifiedLinkError

我的 makefile 是否缺少某些东西可以很好地编译为 32 位?

【问题讨论】:

  • 那么你使用的是什么版本的java?也许是 64 位版本?
  • 我使用 32 位 jre。但是自从我发布了我的问题后,我的问题就被翻译成了Can't find dependent libraries
  • 如果你仍然卡住 - 依赖 walker 是你的朋友
  • 谢谢,我试试这个。

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


【解决方案1】:

如果您使用 32/64 位库,共享通用系统库可能会很困难:

  • 确保将 32 位库放在 PATH 上(您的 DLL 所依赖的库)
  • 制作一个简单的包装代码并仔细检查您的 DLL 在 JVM 之外是否可以正常工作

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 2014-12-25
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      相关资源
      最近更新 更多