使用“USB4JAVA.jar”获取有关linux中连接设备的信息

时间:2014-09-01 10:44:52

标签: java linux usb4java

我谷歌关于获取连接到Linux操作系统的USB信息,发现USB4JAVA非常有帮助。我找到了示例代码如下。现在运行之后,我得到了" java.lang.ExceptionInInitializerError"的异常。

我使用的代码:

import org.usb4java.ConfigDescriptor;
import org.usb4java.Context;
import org.usb4java.DescriptorUtils;
import org.usb4java.Device;
import org.usb4java.DeviceDescriptor;
import org.usb4java.DeviceHandle;
import org.usb4java.DeviceList;
import org.usb4java.LibUsb;
import org.usb4java.LibUsbException;
/**
* Dumps the descriptors of all available devices.
*
* @author Klaus Reimer <k@ailis.de>
*/
public class DumpDevices
{
    /**
    * Dumps all configuration descriptors of the specified device. Because
    * libusb descriptors are connected to each other (Configuration descriptor
    * references interface descriptors which reference endpoint descriptors)
    * dumping a configuration descriptor also dumps all interface and endpoint
    * descriptors in this configuration.
    *
    * @param device
    * The USB device.
    * @param numConfigurations
    * The number of configurations to dump (Read from the device
    * descriptor)
    */
    public static void dumpConfigurationDescriptors(final Device device,
    final int numConfigurations)
    {
        for (byte i = 0; i < numConfigurations; i += 1)
        {
            final ConfigDescriptor descriptor = new ConfigDescriptor();
            final int result = LibUsb.getConfigDescriptor(device, i, descriptor);
            if (result < 0)
            {
                throw new LibUsbException("Unable to read config descriptor",
                result);
            }
            try
            {
                System.out.println(descriptor.dump().replaceAll("(?m)^",
                " "));
            }
            finally
            {
                // Ensure that the config descriptor is freed
                LibUsb.freeConfigDescriptor(descriptor);
            }
        }
    }
    /**
    * Dumps the specified device to stdout.
    *
    * @param device
    * The device to dump.
    */
    public static void dumpDevice(final Device device)
    {
        // Dump device address and bus number
        final int address = LibUsb.getDeviceAddress(device);
        final int busNumber = LibUsb.getBusNumber(device);
        System.out.println(String
        .format("Device %03d/%03d", busNumber, address));
        // Dump port number if available
        final int portNumber = LibUsb.getPortNumber(device);
        if (portNumber != 0)
            System.out.println("Connected to port: " + portNumber);
        // Dump parent device if available
        final Device parent = LibUsb.getParent(device);
        if (parent != null)
        {
            final int parentAddress = LibUsb.getDeviceAddress(parent);
            final int parentBusNumber = LibUsb.getBusNumber(parent);
            System.out.println(String.format("Parent: %03d/%03d",
            parentBusNumber, parentAddress));
        }
        // Dump the device speed
        System.out.println("Speed: "
        + DescriptorUtils.getSpeedName(LibUsb.getDeviceSpeed(device)));
        // Read the device descriptor
        final DeviceDescriptor descriptor = new DeviceDescriptor();
        int result = LibUsb.getDeviceDescriptor(device, descriptor);
        if (result < 0)
        {
            throw new LibUsbException("Unable to read device descriptor",
            result);
        }
        // Try to open the device. This may fail because user has no
        // permission to communicate with the device. This is not
        // important for the dumps, we are just not able to resolve string
        // descriptor numbers to strings in the descriptor dumps.
        DeviceHandle handle = new DeviceHandle();
        result = LibUsb.open(device, handle);
        if (result < 0)
        {
            System.out.println(String.format("Unable to open device: %s. "
            + "Continuing without device handle.",
            LibUsb.strError(result)));
            handle = null;
        }
        // Dump the device descriptor
        System.out.print(descriptor.dump(handle));
        // Dump all configuration descriptors
        dumpConfigurationDescriptors(device, descriptor.bNumConfigurations());
        // Close the device if it was opened
        if (handle != null)
        {
            LibUsb.close(handle);
        }
    }
    /**
    * Main method.
    *
    * @param args
    * Command-line arguments (Ignored)
    */
    public static void main(final String[] args)
    {
        // Create the libusb context
        final Context context = new Context();
        // Initialize the libusb context
        int result = LibUsb.init(context);
        if (result < 0)
        {
            throw new LibUsbException("Unable to initialize libusb", result);
        }
        // Read the USB device list
        final DeviceList list = new DeviceList();
        result = LibUsb.getDeviceList(context, list);
        if (result < 0)
        {
            throw new LibUsbException("Unable to get device list", result);
        }
        try
        {
            // Iterate over all devices and dump them
            for (Device device: list)
            {
                dumpDevice(device);
            }
        }
        finally
        {
            // Ensure the allocated device list is freed
            LibUsb.freeDeviceList(list, true);
        }
        // Deinitialize the libusb context
        LibUsb.exit(context);
    }
}

我得到的例外:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at find_usb.DumpDevices.main(DumpDevices.java:132)
Caused by: org.usb4java.LoaderException: Native library not found in classpath: /org/usb4java/linux-x86/libusb4java.so
    at org.usb4java.Loader.extractLibrary(Loader.java:281)
    at org.usb4java.Loader.load(Loader.java:358)
    at org.usb4java.LibUsb.<clinit>(LibUsb.java:640)

2 个答案:

答案 0 :(得分:0)

异常状态中的描述

Native library not found in classpath: /org/usb4java/linux-x86/libusb4java.so

您的JVM系统是什么arch

如果您运行的是x64,那么x86库将无法运行,您需要将本机库设置为正确的x64库。

但是如果您正在运行x86 JVM,请检查文件是否确实存在且是否正确。打开包装时可能出了什么问题?或者它在另一个文件夹中?

答案 1 :(得分:0)

您似乎忘了在项目中添加libusb4java-1.2.0-linux-x86.jar库。