Linux 错误的 ELF 类:ELFCLASS32(可能的原因:架构字宽不匹配)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16188672/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 22:46:53  来源:igfitidea点击:

wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)

javalinuxexceptionubuntucardreader

提问by

I have this strange exception saying wrong ELF class but the wrapper is set correctly.

我有一个奇怪的异常,说 ELF 类错误,但包装器设置正确。

To read Belgiun ID card using this SDK from belgiun ID card issuers official site: http://eid.belgium.be/en/binaries/beid-sdk-3.5.3-ubuntu-9.10-i686-6193_tcm147-94066_tcm406-114986.tgz

从比利时身发行商官方网站使用此 SDK 读取比利时身:http://eid.belgium.be/en/binaries/beid-sdk-3.5.3-ubuntu-9.10-i686-6193_tcm147-94066_tcm406-114986 。 tgz

$ uname -a # Using NetBeans IDE 7.3 in Ubuntu 12.10 64-bit
Linux sun-M14xR2 3.5.0-25-generic #39-Ubuntu SMP Mon Feb 25 18:26:58 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$ java -version
java version "1.7.0_15"
OpenJDK Runtime Environment (IcedTea7 2.3.7) (7u15-2.3.7-0ubuntu1~12.10.1)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

Code:

代码:

package javaapplication1;

import java.lang.*;
import be.belgium.eid.*;

public class JavaApplication1 {
  //*****************************************************************************
  // Get the data and dump to the screen
  // Beware: The data coming from the cards is encoded in UTF8!
  //*****************************************************************************

  private static void getSISData(BEID_SISCard card) throws Exception {
    BEID_SisId sisId = card.getID();

    System.out.println();

    System.out.println("\tPeronal data:");
    System.out.println("\t-------------");
    System.out.println("\tName                 : " + sisId.getName());
    System.out.println("\tSurname              : " + sisId.getSurname());
    System.out.println("\tInitials             : " + sisId.getInitials());
    System.out.println("\tGender               : " + sisId.getGender());
    System.out.println("\tDateOfBirth          : " + sisId.getDateOfBirth());
    System.out.println("\tSocialSecurityNumber : " + sisId.getSocialSecurityNumber());

    System.out.println();

    System.out.println("\tCard data:");
    System.out.println("\t----------");
    System.out.println("\tLogicalNumber        : " + sisId.getLogicalNumber());
    System.out.println("\tDateOfIssue          : " + sisId.getDateOfIssue());
    System.out.println("\tValidityBeginDate    : " + sisId.getValidityBeginDate());
    System.out.println("\tValidityEndDate      : " + sisId.getValidityEndDate());
  }

  //*****************************************************************************
  // Get the data from a Belgian SIS card
  //*****************************************************************************
  private static void getSISCardData(BEID_ReaderContext readerContext) throws Exception {
    BEID_SISCard card = readerContext.getSISCard();
    getSISData(card);
  }

  //*****************************************************************************
  // Get the data and dump to the screen
  // Beware: The data coming from the cards is encoded in UTF8!
  //*****************************************************************************
  private static void getEIDData(BEID_EIDCard card) throws Exception {
    BEID_EId eid = card.getID();

    if (card.isTestCard()) {
      card.setAllowTestCard(true);
      System.out.println("");
      System.out.println("Warning: This is a test card.");
    }

    System.out.println("\tDocumentVersion    : " + eid.getDocumentVersion());
    System.out.println("\tDocumentType       : " + eid.getDocumentType());

    System.out.println();

    System.out.println("\tPeronal data:");
    System.out.println("\t-------------");
    System.out.println("\tFirstName          : " + eid.getFirstName());
    System.out.println("\tSurname            : " + eid.getSurname());
    System.out.println("\tGender             : " + eid.getGender());
    System.out.println("\tDateOfBirth        : " + eid.getDateOfBirth());
    System.out.println("\tLocationOfBirth    : " + eid.getLocationOfBirth());
    System.out.println("\tNobility           : " + eid.getNobility());
    System.out.println("\tNationality        : " + eid.getNationality());
    System.out.println("\tNationalNumber     : " + eid.getNationalNumber());
    System.out.println("\tSpecialOrganization: " + eid.getSpecialOrganization());
    System.out.println("\tMemberOfFamily     : " + eid.getMemberOfFamily());
    System.out.println("\tAddressVersion     : " + eid.getAddressVersion());
    System.out.println("\tStreet             : " + eid.getStreet());
    System.out.println("\tZipCode            : " + eid.getZipCode());
    System.out.println("\tMunicipality       : " + eid.getMunicipality());
    System.out.println("\tCountry            : " + eid.getCountry());
    System.out.println("\tSpecialStatus      : " + eid.getSpecialStatus());

    System.out.println("");

    System.out.println("\tCard data:");
    System.out.println("\t----------");
    System.out.println("\tLogicalNumber      : " + eid.getLogicalNumber());
    System.out.println("\tChipNumber         : " + eid.getChipNumber());
    System.out.println("\tValidityBeginDate  : " + eid.getValidityBeginDate());
    System.out.println("\tValidityEndDate    : " + eid.getValidityEndDate());
    System.out.println("\tIssuingMunicipality: " + eid.getIssuingMunicipality());
  }

  //*****************************************************************************
  // Get the data from a Belgian kids EID card
  //*****************************************************************************
  private static void getKidsCardData(BEID_ReaderContext readerContext) throws Exception {
    BEID_KidsCard card = readerContext.getKidsCard();
    getEIDData(card);
  }

  //*****************************************************************************
  // Get the data from a Belgian foreigner EID card
  //*****************************************************************************
  private static void getForeignerCardData(BEID_ReaderContext readerContext) throws Exception {
    BEID_ForeignerCard card = readerContext.getForeignerCard();
    getEIDData(card);
  }

  //*****************************************************************************
  // Get the data from a Belgian EID card
  //*****************************************************************************
  private static void getEidCardData(BEID_ReaderContext readerContext) throws Exception {
    BEID_EIDCard card = readerContext.getEIDCard();
    getEIDData(card);
  }

  //*****************************************************************************
  // get a string representation of the card type
  //*****************************************************************************
  private static String getCardTypeStr(BEID_ReaderContext readerContext) throws Exception {
    String strCardType = "UNKNOWN";
    BEID_CardType cardType = readerContext.getCardType();

    if (cardType == BEID_CardType.BEID_CARDTYPE_EID) {
      strCardType = "BEID_CARDTYPE_EID";
    } else if (cardType == BEID_CardType.BEID_CARDTYPE_KIDS) {
      strCardType = "BEID_CARDTYPE_KIDS";
    } else if (cardType == BEID_CardType.BEID_CARDTYPE_FOREIGNER) {
      strCardType = "BEID_CARDTYPE_FOREIGNER";
    } else if (cardType == BEID_CardType.BEID_CARDTYPE_SIS) {
      strCardType = "BEID_CARDTYPE_SIS";
    } else {
      strCardType = "BEID_CARDTYPE_UNKNOWN";
    }
    return strCardType;
  }

  //*****************************************************************************
  // Show the info of the card in the reader
  //*****************************************************************************
  private static void showCardInfo(String readerName) throws Exception {
    BEID_ReaderContext readerContext = BEID_ReaderSet.instance().getReaderByName(readerName);
    if (readerContext.isCardPresent()) {
      System.out.println("\tType               : " + getCardTypeStr(readerContext));

      BEID_CardType cardType = readerContext.getCardType();

      if (cardType == BEID_CardType.BEID_CARDTYPE_EID) {
        getEidCardData(readerContext);
      } else if (cardType == BEID_CardType.BEID_CARDTYPE_KIDS) {
        getKidsCardData(readerContext);
      } else if (cardType == BEID_CardType.BEID_CARDTYPE_FOREIGNER) {
        getForeignerCardData(readerContext);
      } else if (cardType == BEID_CardType.BEID_CARDTYPE_SIS) {
        getSISCardData(readerContext);
      } else {
      }
    }
  }

  //*****************************************************************************
  // Show the reader info an get the data of the card if present
  //*****************************************************************************
  private static void showReaderCardInfo(String readerName) throws Exception {
    BEID_ReaderContext readerContext = BEID_ReaderSet.instance().getReaderByName(readerName);

    System.out.println("Reader: " + readerName);
    System.out.println("\tCard present: " + (readerContext.isCardPresent() ? "yes" : "no"));

    showCardInfo(readerName);

    System.out.println("");
  }

  //*****************************************************************************
  // scan all the card readers and if a card is present, show the content of the
  // card.
  //*****************************************************************************
  private static void scanReaders() throws Exception {
    long nrReaders = BEID_ReaderSet.instance().readerCount();
    System.out.println("Nr of card readers detected: " + nrReaders);

    for (int readerIdx = 0; readerIdx < nrReaders; readerIdx++) {
      String readerName = BEID_ReaderSet.instance().getReaderName(readerIdx);
      showReaderCardInfo(readerName);
    }
  }

  //*****************************************************************************
  // Main entry point
  //*****************************************************************************
  public static void main(String argv[]) {
    System.out.println("[Info]  eID SDK sample program: read_eid");

    String osName = System.getProperty("os.name");

    if (-1 != osName.indexOf("Windows")) {
      System.out.println("[Info]  Windows system!!");
      System.loadLibrary("beid35libJava_Wrapper");
    } else {
      System.loadLibrary("beidlibJava_Wrapper");
    }

    try {
      BEID_ReaderSet.initSDK();
      scanReaders();
    } catch (BEID_Exception e) {
      System.out.println("[Catch] BEID_Exception:" + e.GetError());
    } catch (Exception e) {
      System.out.println("[Catch] Exception:" + e.getMessage());
    }


    try {
      BEID_ReaderSet.releaseSDK();
    } catch (BEID_Exception e) {
      System.out.println("[Catch] BEID_Exception:" + e.GetError());
    } catch (Exception e) {
      System.out.println("[Catch] Exception:" + e.getMessage());
    }
  }
}

Output:

输出:

[Info]  eID SDK sample program: read_eid
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/sun/Downloads/beidsdk/beidlib/Java/unsigned/libbeidlibJava_Wrapper.so.3.5.3: /home/sun/Downloads/beidsdk/beidlib/Java/unsigned/libbeidlibJava_Wrapper.so.3.5.3: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1675)
    at java.lang.Runtime.loadLibrary0(Runtime.java:840)
    at java.lang.System.loadLibrary(System.java:1047)
    at javaapplication1.JavaApplication1.main(JavaApplication1.java:269)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

EDIT:

编辑:

https://code.google.com/p/eid-viewer/https://code.google.com/p/eid-mw/

https://code.google.com/p/eid-viewer/ https://code.google.com/p/eid-mw/

采纳答案by Jesper

It doesn't work because you're using a 64-bit version of Java, and the SDK you're trying to use contains a 32-bit native library (libbeidlibJava_Wrapper.so.3.5.3). The 64-bit JRE cannot load 32-bit native libraries.

它不起作用,因为您使用的是 64 位版本的 Java,而您尝试使用的 SDK 包含一个 32 位本机库 ( libbeidlibJava_Wrapper.so.3.5.3)。64 位 JRE 无法加载 32 位本机库。

You'll need to use a 32-bit version of Java, or find a version of the SDK that has 64-bit native libraries.

您需要使用 32 位版本的 Java,或者找到具有 64 位本机库的 SDK 版本。