Tengo un programa en Java que se llama código de C a través de JNI que estoy intentando ejecutar en Linux. El código externo se compone de dos .por lo que los archivos: uno para la JNI enlaces (construido con swig) y el otro con las funciones reales. Tengo los dos bibliotecas en el mismo directorio y LD_LIBRARY_PATH está configurado correctamente. ldd informes sin problemas cuando se ejecuta desde la línea de comandos, pero cuando me puse la variable LD_LIBRARY_PATH para el mismo valor en la opción «ejecutar configuraciones de diálogo» en el editor de Eclipse y el intento de ejecutar el programa, se obtiene el siguiente error:

java.lang.UnsatisfiedLinkError: [ruta de acceso a las bibliotecas]/[JNI de unión de la biblioteca].así: [código real biblioteca].así que: no se puede abrir el archivo objeto compartido: No existe el fichero o directorio

Esto me lleva a creer que la JNI de contenedor de la biblioteca se carga correctamente, pero hay un fallo cuando la biblioteca intenta cargar la biblioteca que contiene el código real. Es allí cualquier manera de depurar esta más?

Yo le nota que está sucediendo este problema en el editor de eclipse en sí mismo y que no he intentado empaquetar el código en un frasco y se ejecuta dentro de un free-standing jvm instancia.

InformationsquelleAutor user98166 | 2009-06-18

7 Comentarios

  1. 2

    Creo que el problema es con la llamada al Sistema.loadLibrary(String) y el uso de LD_LIBRARY_PATH. Mediante loadLibrary(«foo») aparecerá en la versión de java.biblioteca.ruta por algo llamado libfoo.así. Si nada de lo que denomina libfoo.así se encuentra obtendrá este error.

    Ahora si usted acaba de crear la variable LD_LIBRARY_PATH, el nativo de símbolos que desee automáticamente será recogido por el enlazador, así que usted no necesita configurar -Djava.biblioteca.ruta de acceso.

    En mi experiencia con el trago en la gdal proyecto, este error es realmente inofensivo y dado que la variable LD_LIBRARY_PATH está configurado, esto va a funcionar bien.

    Recomiendo usar -Djava.biblioteca.ruta de acceso y llamar a loadLibrary explitly, la razón es que si alguna vez decide implementar su aplicación con webstart, explícitamente necesidad de llamar a loadLibrary para obtener su nativo libs recogido.

    Cuando yo uso eclipse me siga las instrucciones que Lucas dio donde edita la biblioteca nativa bajo el frasco en la ficha Bibliotecas en la construcción de Camino. Sólo para mencionar de nuevo, esto sólo conjuntos de java.biblioteca.camino bajo las sábanas.

  2. 1

    Puede ser que usted sólo tiene que encontrar el lugar adecuado en la ejecución de diálogo de configuración para poner el -Djava.biblioteca.path=… opción. De primeras yo creo que se quiere -D se define en el «argumentos de vm» en los argumentos de la ficha, mientras que si desea definir LD_LIBRARY_PATH que va en la ficha entorno. Eclipse alegremente vamos a poner las cosas en lugares donde ellos no significa lo que usted piensa que significa. De todos modos, he utilizado las bibliotecas de esta manera antes y si tengo la oportunidad voy a buscar lo que yo hice y edite mi respuesta aquí.

    Otra cosa a intentar es jugar con LD_DEBUG. Usted puede establecer la variable de entorno LD_DEBUG a varias cosas (prueba de TODO) y, a continuación, el gestor de arranque de linux va a divulgar todo tipo de información útil acerca de lo que una aplicación está intentando cargar, donde es buscando cosas, etc. Por supuesto, esta pre-supone que el lanzamiento de eclipse desde una línea de comandos, así que usted puede establecer el env variables y ver el cargador de diagnóstico; pero en cuanto al sistema de que se trate, cuando se ejecuta la aplicación desde dentro de eclipse, su aplicación es algo eclipse está haciendo, por lo que cualquier biblioteca de la carga de comportamiento puede ser visto de esta manera.

  3. 0

    Usted podría tratar de -Djava.library.path=actual.so en parámetros de línea de comandos tal vez?

    En windows, he tenido problemas similares con una 3ª parte de la biblioteca, que utiliza un JNI wrapper DLL para sus archivos Dll. Mi proyecto tenía la DLL en el directorio lib así que he añadido lib a la RUTA de acceso (por ejemplo, PATH=%PATH%;./lib variable de entorno y todo empezó a funcionar.

  4. 0

    Que yo sepa el Eclipse no utilizar la variable LD_LIBRARY_PATH.
    La manera más sencilla de configurar el derecho nativo de la biblioteca de ruta es ir a
    Propiedades del proyecto -> Java Build Path -> Bibliotecas
    A continuación, expanda el JRE Sistema de entrada de la Biblioteca o (si está disponible)
    El Archivo Jar que utiliza la Biblioteca nativa,
    seleccione «Nativo Ubicación de la Biblioteca», a continuación, haga clic en «Editar» y seleccione la carpeta bibliotecas se encuentran en. En realidad, no establece la -Djava.biblioteca.variable path para que usted tenga que incluir esto en su línea de comandos si inicia el programa desde fuera de eclipse.

  5. 0

    Hay otras bibliotecas que sus dos bibliotecas dependen? Si es así, usted necesita para asegurarse de que ellos también son accesibles a la JVM.

    Ser consciente, la configuración manual «-Djava.biblioteca.la ruta de acceso» parece borrar la biblioteca por defecto la ruta.

    Así con el siguiente código:

    public class LibTest {
        public static void main(String[] args) {
            String property = System.getProperty("java.library.path");
            StringTokenizer parser = new StringTokenizer(property, ":");
            while (parser.hasMoreTokens()) {
                System.err.println(parser.nextToken());
            }
        }
    }

    Lanzado desde eclipse con Java 1.6.0_14 salidas:

    /opt/java/jre/lib/i386/client
    /opt/java/jre/lib/i386
    /opt/java/jre/../lib/i386
    /opt/java/jre/lib/i386/client
    /opt/java/jre/lib/i386
    /usr/lib/xulrunner-devel-1.9.0.11
    /usr/lib/xulrunner-devel-1.9.0.11
    /usr/java/packages/lib/i386
    /lib
    /usr/lib

    Pero cuando me puse la JVM arg «-Djava.biblioteca.path=/tmp/» yo sólo llegar:

    /tmp/

    Si la configuración manual de java.biblioteca.ruta de esto puede explicar por qué ldd funciona desde la línea de comandos, pero su .así que no se de eclipse/java.

    Usted puede tratar de no configuración de java.biblioteca.ruta de acceso y el uso del Sistema.carga con la ruta absoluta a la biblioteca en lugar de llamar al Sistema.loadLibrary. Esto puede permitir que la JVM para encontrar tu .así y todavía utilizar la ruta de acceso predeterminada cuando la búsqueda de sus dependencias.

    Por supuesto, si esto no es ningún uso, a continuación, usted puede también intentar activar la jni de salida de depuración con «-verbose:jni» en la línea de comandos. Esto puede dar algunas pistas sobre el problema.

  6. 0

    La adición de esta respuesta puede ser puede ser útil En AIX Máquinas que necesitamos para la instalación de LIBPATH variable de entorno en lugar de LD_LIBRARY_PATH.

Dejar respuesta

Please enter your comment!
Please enter your name here