android - libusb_open 返回 LIBUSB_ERROR_ACCESS?

标签 android android-ndk libusb-1.0

我在使用 jni 的 Android 应用程序中使用 libusb。我能够使用 libusb 找到设备。但打不开。

TestExP.c

#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <libusb.h>
#include <jni.h>

#define MY_VENDOR_ID    0xXXXX
#define MY_PRODUCT_ID       0xXXXX

int is_usbdevblock( libusb_device *dev )
{
struct libusb_device_descriptor desc;
int r = libusb_get_device_descriptor( dev, &desc );

if( desc.idVendor == MY_VENDOR_ID && desc.idProduct == MY_PRODUCT_ID ){
    return 1;
}

return 0;
}
char* mymethod()
{
    libusb_device **list;
    libusb_device *found = NULL;
    libusb_context *ctx = NULL;
    int attached = 0;
    if(libusb_init(&ctx)!=0)
       return "libusb init failed";

    libusb_set_debug(ctx,3);
    ssize_t cnt = libusb_get_device_list(ctx, &list);
    ssize_t i = 0;
    int err = 0;
    if (cnt < 0)
        return "No usb device on system";
    for(i = 0; i < cnt; i++){
        libusb_device *device = list[i];
        if( is_usbdevblock(device) ){
            found = device;
        break;
        }
    }
    if(found){
        libusb_device_handle *handle;
        err = libusb_open(found, &handle);
        if (err)
            return "Open error";
        return "Device Opened";
    }
return "Device not found";
}

JNIEXPORT jstring JNICALL Java_com_example_test_Test_TestOpen(JNIEnv* env, jobject obj)
{
    return mymethod();
}

安卓.mk

 include $(CLEAR_VARS)
 LOCAL_MODULE    := libusb-1.0
 LOCAL_SRC_FILES := libusb-1.0.so
 include $(PREBUILT_SHARED_LIBRARY)

 include $(CLEAR_VARS)
 LOCAL_MODULE    := TestExP
 LOCAL_SRC_FILES := TestExP.c
 LOCAL_SHARED_LIBRARIES += usb-1.0
 include $(BUILD_SHARED_LIBRARY)

在我的 Activity 课上,我会遵循...

测试.java

static{
    System.loadLibrary("usb-1.0");
    System.loadLibrary("TestExP");
}
 public native String TestOpen();

一切正常。 当我运行这个程序时,它返回 -3 libusb 错误代码,上面写着“LIBUSB_ERROR_ACCESS” 我做错了什么。有人说给 usb 设备权限。 我可以使用 Android USB-API 打开设备并连接到设备。 但我想用 libusb-1.0 做到这一点。

最佳答案

找到您的设备并记住它的 VID 和 PID:

lsusb

创建规则文件:

sudo gedit /etc/udev/rules.d/99-my-android-device.rules

Enter next strings to file,用你的VID和PID填充03eb204f<​​:

ACTION!="add|change", GOTO="my_android_device_rules_end"
SUBSYSTEM!="usb|tty|hidraw", GOTO="my_android_device_rules_end"

ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="664", GROUP="plugdev"

LABEL="my_android_device_rules_end"

将自己添加到 plugdev 组:

usermod -aG plugdev $USER

重新登录或重启。

您也可能对类似的 issue 感兴趣.

关于android - libusb_open 返回 LIBUSB_ERROR_ACCESS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923820/

相关文章:

android - 如何从 JNI/NDK C++ 代码访问/res/raw?

android - 如何使用android ndk r8e中引入的静态代码分析器?

c++ - 以用户身份而非 sudo 身份运行时 libusb 1.0 程序中的段错误

安卓NDK : Error: must be enabled with the -std=c++11 or -std=gnu++11 compiler options

Android SharePrefrences 问题

java - 如何使我的 ListView 行具有不同的高度

android - 如何从 cpp 文件中调用 setRequestedOrientation()?

javascript - 如何使用 libusb 将数据发送到 node.js 中的 USB 设备

c - libusb-1.0 通用 USB 设备的写权限

java - 更改 ListView 的搜索输入中的默认键盘语言