首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android N libusb_init返回-1初始化libusb失败

Android N libusb_init返回-1初始化libusb失败
EN

Stack Overflow用户
提问于 2017-07-07 06:57:58
回答 2查看 923关注 0票数 0

我在我的安卓应用程序中使用libusb库。我构建了这个库,并为所有架构添加了*.so文件。

我调用libusb_init来初始化它,但是它总是返回-1。我不确定这个许可是什么还是什么。

初始化libusb失败

我在库中看到了libusb_init方法代码:

代码语言:javascript
运行
复制
/** \ingroup lib
 * Initialize libusb. This function must be called before calling any other
 * libusb function.
 *
 * If you do not provide an output location for a context pointer, a default
 * context will be created. If there was already a default context, it will
 * be reused (and nothing will be initialized/reinitialized).
 *
 * \param context Optional output location for context pointer.
 * Only valid on return code 0.
 * \returns 0 on success, or a LIBUSB_ERROR code on failure
 * \see contexts
 */
int API_EXPORTED libusb_init(libusb_context **context)
{
    char *dbg = getenv("LIBUSB_DEBUG");
    struct libusb_context *ctx;
    int r = 0;

    usbi_mutex_static_lock(&default_context_lock);
    if (!context && usbi_default_context) {
        usbi_dbg("reusing default context");
        default_context_refcnt++;
        usbi_mutex_static_unlock(&default_context_lock);
        return 0;
    }

    ctx = malloc(sizeof(*ctx));
    if (!ctx) {
        r = LIBUSB_ERROR_NO_MEM;
        goto err_unlock;
    }
    memset(ctx, 0, sizeof(*ctx));

    if (dbg) {
        ctx->debug = atoi(dbg);
        if (ctx->debug)
            ctx->debug_fixed = 1;
    }

    usbi_dbg("libusb-%d.%d.%d%s%s%s",
             libusb_version_internal.major,
             libusb_version_internal.minor,
             libusb_version_internal.micro,
             libusb_version_internal.rc,
             libusb_version_internal.describe[0] ? " git:" : "",
             libusb_version_internal.describe);

    if (usbi_backend->init) {
        r = usbi_backend->init(ctx);
        if (r)
            goto err_free_ctx;
    }

    usbi_mutex_init(&ctx->usb_devs_lock, NULL);
    usbi_mutex_init(&ctx->open_devs_lock, NULL);
    list_init(&ctx->usb_devs);
    list_init(&ctx->open_devs);

    r = usbi_io_init(ctx);
    if (r < 0) {
        if (usbi_backend->exit)
            usbi_backend->exit();
        goto err_destroy_mutex;
    }

    if (context) {
        *context = ctx;
    } else if (!usbi_default_context) {
        usbi_dbg("created default context");
        usbi_default_context = ctx;
        default_context_refcnt++;
    }
    usbi_mutex_static_unlock(&default_context_lock);

    return 0;

err_destroy_mutex:
    usbi_mutex_destroy(&ctx->open_devs_lock);
    usbi_mutex_destroy(&ctx->usb_devs_lock);
err_free_ctx:
    free(ctx);
err_unlock:
    usbi_mutex_static_unlock(&default_context_lock);
    return r;
}

我对它进行了调试,并使用-1代码从上述方法的这一行中找到了流返回。

代码语言:javascript
运行
复制
if (usbi_backend->init) {
    r = usbi_backend->init(ctx);
    if (r)
        goto err_free_ctx;
}

我是用JNI包装器从java代码调用的。

代码语言:javascript
运行
复制
class MainActivity : AppCompatActivity(), AnkoLogger {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            val ret = initUSB()
            toast(ret)
        }
    }

    init {
        System.loadLibrary("usbnok");
    }

    /*
     * native function prototypes
     */
    external fun initUSB(): String
}

JNI包装器

代码语言:javascript
运行
复制
jstring Java_com_williams_poc_MainActivity_initUSB( JNIEnv* env, jobject thiz )
{
  int r;
  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "entering iniUSB");
  r = libusb_init(NULL);
    if(r < 0) {
    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "failed to initialize libusb");
    return  (*env)->NewStringUTF(env, "Failed to initialize libusb");
  } else {
    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "successfully initialized libusb");
    return (*env)->NewStringUTF(env, "libusb successfully enabled");
  }
}

有人知道它什么时候回来吗?有什么问题吗?提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-07-13 11:04:17

对libusb来说,与Android 7+的兼容性是一个众所周知的问题。

库尔迪普·辛格·达卡和马丁·马里诺夫修改了适用于仙女座4-6的版本,但你需要用一种特殊的方式打开这个设备。说明是在库尔迪普的GitHub回购。

据我所知,到目前为止还没有人在Android N上运行libusb的修改版本。

如果你能让它工作,请张贴在邮件列表上。每个人都想听听你是怎么做到的。

~克里斯

票数 1
EN

Stack Overflow用户

发布于 2021-09-28 10:46:36

您必须使用LibUsb版本v1.0.23 +

然后用libusb_init初始化成功。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44964414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档