Question

J'essaie de lier la bibliothèque dhcpctl à Java à l'aide de la JNA. C'est mon code (je n'ai pas encore déclaré toutes les fonctions):

package com.abiquo.abicloud.omapi;

import com.abiquo.abicloud.omapi.DHCPControlStructure.DHCPCtrlDataString;
import com.abiquo.abicloud.omapi.DHCPControlStructure.DHCPHandle;
import com.abiquo.abicloud.omapi.OmapiControlStructure.OmapiObjectTypeT;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

/**
 * Binding of the dhcpctl header. 
 * @author jdevesa@abiquo.com
 */
public interface DHCPControlLibrary extends Library
{
    /**
     * Create the loaded instance of the native library
     */
    DHCPControlLibrary INSTANCE =
        (DHCPControlLibrary) Native.loadLibrary("dhcpctl", DHCPControlLibrary.class);

    /**
     * Define as synchronized
     */
    DHCPControlLibrary SYNC_INSTANCE=(DHCPControlLibrary)                              Native.synchronizedLibrary(INSTANCE);

    int dhcpctl_initialize ();
    int dhcpctl_connect (DHCPHandle handle1, String address, int port, DHCPHandle.ByValue handle2);
    int dhcpctl_wait_for_completion (DHCPHandle handle, Pointer int1);
    int dhcpctl_get_value (DHCPCtrlDataString dataString , DHCPHandle.ByValue handleValue, String str1);
    int dhcpctl_get_boolean (Pointer int1, DHCPHandle.ByValue handleValue, String str1);
    int dhcpctl_set_value (DHCPHandle.ByValue handleValue, DHCPCtrlDataString dataString, String str1);
    ... etc ...

}

dhcpctl utilise la bibliothèque omapi pour appeler le serveur DHCP distant. Donc, quand j'essaye de charger la bibliothèque avec:

DHCPControlLibrary dhcpExecutor = DHCPControlLibrary.INSTANCE; 

il génère l'erreur suivante:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'dhcpctl': /usr/lib/libdhcpctl.so: undefined symbol: omapi_type_generic
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:160)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:228)
    at com.sun.jna.Library$Handler.<init>(Library.java:140)
    at com.sun.jna.Native.loadLibrary(Native.java:372)
    at com.sun.jna.Native.loadLibrary(Native.java:357)
    at com.abiquo.abicloud.omapi.DHCPControlLibrary.<clinit>(DHCPControlLibrary.java:40)
    at com.abiquo.abicloud.omapi.DHCPexecution.main(DHCPexecution.java:11)

omapi__type__generic est une variable externe stockée dans omapi.h. Je pense que je dois faire une sorte de lien lorsque je charge la bibliothèque, mais je ne sais pas comment le faire.

Merci beaucoup.

Était-ce utile?

La solution

omapi_type_generic n'est pas "une variable externe stockée dans omap.h".

Cette variable doit être définie dans un fichier .c quelque part et donc dans un fichier .so ou .a.

S'il n'est défini dans aucun fichier .c, le problème est tout de suite là. Découvrez pourquoi, corrigez-le et surmontez cette exception.

Autres conseils

Très probablement, vous devrez charger explicitement la bibliothèque omapi ou vous assurer qu'elle se trouve dans LD_LIBRARY_PATH afin que le système puisse la trouver automatiquement lorsque la bibliothèque dhcpctl est chargée.

Je pense que vous oubliez extern " C " en écrivant du code c ++. Dans mon cas code c ++:

    #include <stdlib.h>  
    #include <iostream>  
    using namespace std;  
    extern "C"  
    {  
        void test() {  
             cout << "TEST" << endl;  
        }  

        int addTest(int a,int b)  
        {  
          int c = a + b ;  
          return c ;  
        }   
    }  

et le code java

    import com.sun.jna.Library;  
    import com.sun.jna.Native;  

    public class jnatest1 {  

        public interface Clibrary extends Library {  
            Clibrary INSTANTCE = (Clibrary) Native.loadLibrary("hello",  
                    Clibrary.class);  

            void test();  
            int addTest(int a,int b);    
        }  

        public static void main(String[] args) {  
            Clibrary.INSTANTCE.test();  
            int c = Clibrary.INSTANTCE.addTest(10,20);    
            System.out.println(c);   
        }  
    }  

ça marche pour moi

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top