2009-07-30 89 views
1

我试图使用JNA将dhcpctl库绑定到Java。这是MI代码(我没有申报所有功能尚未):JNA未定义符号

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 [email protected] 
*/ 
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使用OMAPI库调用远程DHCP服务器。所以,当我尝试加载库:

DHCPControlLibrary dhcpExecutor = DHCPControlLibrary.INSTANCE; 

它引发以下错误:

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是存储在omapi.h外部变量。我想我在加载库时必须做一些链接,但我不知道如何去做。

非常感谢。

回答

1

omapi_type_generic不是“存储在omap.h中的外部变量”。

此变量必须在某个.c文件中的某个地方定义,因此在某些.so或.a中定义。

如果它没有在任何.c文件中定义,那么你的问题就在那里。找出它为什么是这样并解决它,你应该克服这个例外。

0

您很可能需要显式加载omapi库或确保其位于LD_LIBRARY_PATH中,以便系统可以在加载dhcpctl库时自动找到它。

0

我想你在编写C++代码时会忘记extern“C”。 在我的情况 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 ; 
     } 
    } 

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

它为我工作