Tengo un programa Java JNI que estoy construyendo en Apple OS-X y compilando de forma cruzada para Windows 10.

La compilación y funciona bien en OS-X. La compilación cruzada para Windows de 64 bits se completa sin errores, pero el programa generado no se ejecuta en Windows 10 y da el error:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\Michael\Documents\JNIExample\MyLib.dll: Can't find dependent libraries

El error se produce solo cuando agrego una referencia al operador nuevo de C ++. Cuando se elimina, el mensaje "No se pueden encontrar las bibliotecas dependientes" desaparece y la aplicación se ejecuta. Este programa se ejecutó una vez con versiones anteriores de estas herramientas y sistemas operativos.

Supongo que me falta algo crucial de x86_64-w64-mingw32-gcc para incluir una biblioteca enlazada estáticamente requerida para el nuevo operador. ¿Alguien puede ayudar?

El comando utilizado para compilar el proyecto se encuentra en el archivo de script de shell de bash: 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

Mi objetivo es hacer una distribución de la aplicación para Windows y Mac usando jlink y jpackage, de modo que todas las bibliotecas finalmente sean necesarias al incluirlas en mi distribución final.

| 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 |
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) 

El SSCCE completo está disponible en git público en: https://gitlab.com/Michael51773/jniexample

0
Michael Ellis 1 sep. 2020 a las 13:49

1 respuesta

La mejor respuesta

El siguiente paso para investigar esto fue crear una aplicación de línea de comandos independiente simple de C ++ que utilizara la biblioteca para compartir.

Esto se creó y se ejecutó correctamente en OS-X, pero al implementar los productos compilados en forma cruzada en la plataforma Windows, no se pudo ejecutar y enumeró las siguientes bibliotecas como faltantes:

  • libstdc ++ - 6.dll
  • libwinpthread-1.dll
  • libgcc_s_seh

Copiar estos archivos de la distribución mingw /usr/local/Cellar/mingw-w64/7.0.0_2/toolchain-x86_64/x86_64-w64-mingw32/ .. en el mismo directorio que la aplicación en la plataforma Windows resolvió el problema.

Me parece que el mingcw g ++ -static-libgcc -static-libstdc ++ puede no estar funcionando como solía hacerlo.

1
Michael Ellis 2 sep. 2020 a las 07:27