nivel - que es la libreria awt en java
Cómo empacar opencv+java en un contenedor (1)
He estado usando Opencv 2.4.5 con Java durante un tiempo para crear una aplicación y ahora quisiera distribuir la aplicación. La biblioteca se carga usando lo siguiente:
static{
System.loadLibrary("opencv_java245");
}
que funciona bien Sin embargo, al exportar, no funciona cuando se ejecuta desde el contenedor:
java -jar build1.jar
El archivo opencv_java245.jar se incluye como una biblioteca de usuario, con un archivo nativo (libopencv_java245.dylib) conectado a él. Cuando ejecuto el archivo ejecutable generado desde Eclipse, obtengo UnsatisfiedLinkError a continuación, a pesar de que las cosas se compilan / ejecutan correctamente en Eclipse.
Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java245 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at com.drawbridge.Main.<clinit>(Main.java:12)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:266)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
¿Alguien conoce una forma simple de empaquetar OpenCV en el contenedor?
Actualización: ahora he agotado todo. Puedo agregar la biblioteca a mi ruta de compilación (y no usar System.loadLibrary) y eso funciona en eclipse, pero no cuando está empaquetado en el contenedor. He intentado todo. También verifiqué el tipo de biblioteca dinámica que estoy tratando de cargar, es
Mach-O 64-bit x86_64 dynamically linked shared library
que parece que debería funcionar bien. He usado -D64 y -D32 para probar y obtener el mismo resultado con ambos.
Como dijo Steven C, fue como en Extraer y cargar DLL de JAR y también en un informe de error . Estaba un poco ignorante de cómo usar dylibs y estaba tratando de ser coherente con un tutorial de OpenCV que utilizaba una "biblioteca de usuario" para agregar un jar, y luego agregar el dylib nativo. Además, por alguna razón, la carga de recursos incluso cuando se usaba "/" se cargaba desde el directorio src, no desde el directorio raíz de mi proyecto (que fue el caso en un proyecto de prueba que hice).
Para aquellos que intentan hacer lo mismo, aquí hay un código para ayudar:
private static void loadLibrary() {
try {
InputStream in = null;
File fileOut = null;
String osName = System.getProperty("os.name");
Utils.out.println(Main.class, osName);
if(osName.startsWith("Windows")){
int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
if(bitness == 32){
Utils.out.println(Main.class, "32 bit detected");
in = Main.class.getResourceAsStream("/opencv/x86/opencv_java245.dll");
fileOut = File.createTempFile("lib", ".dll");
}
else if (bitness == 64){
Utils.out.println(Main.class, "64 bit detected");
in = Main.class.getResourceAsStream("/opencv/x64/opencv_java245.dll");
fileOut = File.createTempFile("lib", ".dll");
}
else{
Utils.out.println(Main.class, "Unknown bit detected - trying with 32 bit");
in = Main.class.getResourceAsStream("/opencv/x86/opencv_java245.dll");
fileOut = File.createTempFile("lib", ".dll");
}
}
else if(osName.equals("Mac OS X")){
in = Main.class.getResourceAsStream("/opencv/mac/libopencv_java245.dylib");
fileOut = File.createTempFile("lib", ".dylib");
}
OutputStream out = FileUtils.openOutputStream(fileOut);
IOUtils.copy(in, out);
in.close();
out.close();
System.load(fileOut.toString());
} catch (Exception e) {
throw new RuntimeException("Failed to load opencv native library", e);
}