Frage

Ich versuche, die dhcpctl Bibliothek, um mit Hilfe von Java JNA zu binden. Dies ist mi-Code (ich nicht erklären, alle Funktionen noch):

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 verwendet omapi Bibliothek der Remote-DHCP-Server aufzurufen. Also, wenn ich versuche, um die Bibliothek zu laden, mit:

DHCPControlLibrary dhcpExecutor = DHCPControlLibrary.INSTANCE; 

es führt den folgenden Fehler:

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 ist eine externe Variable in omapi.h gespeichert. Ich glaube, ich habe eine Art von Verknüpfung zu tun, wenn ich die Bibliothek laden, aber ich weiß nicht, wie es zu tun.

Vielen Dank.

War es hilfreich?

Lösung

omapi_type_generic ist nicht "eine externe Variable in omap.h gespeichert".

Diese Variable muss in einiger C-Datei irgendwo und damit in einem gewissen .so oder .a definiert werden.

Wenn es nicht in jeder C-Datei definiert ist, dann gibt es das Problem genau dort. Finden Sie heraus, warum es so und beheben, und Sie sollten diese Ausnahme überwinden.

Andere Tipps

Wahrscheinlich müssen Sie entweder explizit die omapi Bibliothek laden oder stellen Sie sicher, dass es in LD_LIBRARY_PATH ist, so dass das System sie automatisch erkennen kann, wenn die dhcpctl Bibliothek geladen wird.

Ich denke, u vergessen extern "C" während c Schreiben ++ Code. In meinem Fall c ++ Code:

    #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 ;  
        }   
    }  

und Java-Code

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

es funktioniert für mich

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top