我有一个 Java JNI 程序,我正在 Apple OS-X 上构建它并为 Windows 10 进行交叉编译。
构建并在 OS-X 上运行良好。Windows 64 位交叉编译完成没有错误,但生成的程序在 Windows 10 下无法运行并给出错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\Michael\Documents\JNIExample\MyLib.dll: Can't find dependent libraries
仅当我添加对 C++ new运算符的引用时才会发生错误。当它被删除时,“找不到依赖库”消失并且应用程序运行。这个程序曾经运行过这些工具和操作系统的早期版本。
我的猜测是我在 x86_64-w64-mingw32-gcc 中遗漏了一些重要的东西,以包含新运算符所需的静态绑定库。任何人都可以帮忙吗?
用于构建项目的命令在bash shell脚本文件中:doit.sh
#!/bin/bash
echo "=== Building on OS-X ==="
export JAVA_HOME="`/usr/libexec/java_home -v '14*'`"
# Clean up
rm -rf bin/*.class MyLib/*.o *.dll *.jnilib *.jar
# Compile Java and generate JNI header file
mkdir -p bin
javac -d bin -h MyLib -sourcepath src src/*.java
# Create the JAR file, main entry point in class MyLib
jar cfe Test.jar MyLib -C bin .
# Build the C++ shared library
gcc -c -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/darwin" MyLib/MyLib.cpp -o MyLib/MyLib.mac.o
g++ -dynamiclib -o libMyLib.jnilib MyLib/*.mac.o
echo "=== Running on OS-X ==="
java -jar Test.jar
echo "=== Building on OS-X ==="
# Cross compile for the Windows shared library
/usr/local/bin/x86_64-w64-mingw32-gcc -D __LP64__ -c -I$JAVA_HOME/include -I$JAVA_HOME/include/darwin MyLib/MyLib.cpp -o MyLib/MyLib.win.o
/usr/local/bin/x86_64-w64-mingw32-g++ -shared -static-libgcc -static-libstdc++ -o MyLib.dll MyLib/*.win.o
我的目标是使用 jlink 和 jpackage 制作应用程序的 Windows 和 Mac 发行版,以便最终将需要包含在我的最终发行版中的所有库。
工具版本| Tool | Version |
|-------------------------|----------------------|
| MacBook Pro | OS-X Catalina 10.15.6 |
| x86_64-w64-mingw32-gcc/g++ | 9.3.0 (GCC) (download with brew install mingw-w64) |
| gcc/g++ | Apple clang version 12.0.0 (clang-1200.0.31.1) |
| java | java version "14.0.1" 2020-04-14 |
x86_64-w64-mingw32-gcc -v 输出
michaelellis$ /usr/local/bin/x86_64-w64-mingw32-gcc -v
Using built-in specs.
COLLECT_GCC=/usr/local/bin/x86_64-w64-mingw32-gcc
COLLECT_LTO_WRAPPER=/usr/local/Cellar/mingw-w64/7.0.0_2/toolchain-x86_64/libexec/gcc/x86_64-w64-mingw32/9.3.0/lto-wrapper
Target: x86_64-w64-mingw32
Configured with: ../configure --target=x86_64-w64-mingw32 --with-sysroot=/usr/local/Cellar/mingw-w64/7.0.0_2/toolchain-x86_64 --prefix=/usr/local/Cellar/mingw-w64/7.0.0_2/toolchain-x86_64 --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --enable-languages=c,c++,fortran --with-ld=/usr/local/Cellar/mingw-w64/7.0.0_2/toolchain-x86_64/bin/x86_64-w64-mingw32-ld --with-as=/usr/local/Cellar/mingw-w64/7.0.0_2/toolchain-x86_64/bin/x86_64-w64-mingw32-as --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --disable-multilib --enable-threads=posix
Thread model: posix
gcc version 9.3.0 (GCC)
完整的 SSCCE 可在 public git 上找到:https ://gitlab.com/Michael51773/jniexample
调查此问题的下一步是创建一个简单的 C++ 独立命令行应用程序,该应用程序利用可共享库。
这在 OS-X 上构建并正确运行,但是当将交叉编译的产品部署到 Windows 平台时,它无法执行,列出以下库丢失:
将mingw发行版/usr/local/Cellar/mingw-w64/7.0.0_2/toolchain-x86_64/x86_64-w64-mingw32/..中的这些文件复制到与Windows平台上的应用程序相同的目录中解决了问题!
在我看来,mingcw g++ -static-libgcc -static-libstdc++可能无法像以前那样工作!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句