简体   繁体   English

Android N libusb_init 返回 -1 未能初始化 libusb

[英]Android N libusb_init returns -1 failed to initialize libusb

I am using libusb library in my android application.我在我的 android 应用程序中使用libusb库。 I build this library and added *.so files for all architecture.我构建了这个库并为所有架构添加了 *.so 文件。

I am calling libusb_init to initialize it but it returns -1 always.我正在调用libusb_init来初始化它,但它总是返回 -1。 I am not sure if this permission issue or what.我不确定这个权限问题还是什么。

failed to initialize libusb无法初始化 libusb

I see libusb_init method code inside library:我在库中看到libusb_init方法代码:

/** \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;
}

I debugged it and found flow returns from this line of above method with -1 code.我调试了它,发现流从上面这行方法返回 -1 代码。

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

I am calling this from java code with JNI wrapper我用 JNI 包装器从 java 代码调用它

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 Wrapper JNI 包装器

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

Does anyone know when it returns -1?有谁知道它什么时候返回-1? What could be the issue ?可能是什么问题 ? Thanks in advance.提前致谢。

Compatibility with Android 7+ is a known issue for libusb. 与Android 7+的兼容性是libusb的已知问题。

Kuldeep Singh Dhaka and Martin Marinov have modified versions that work a treat for Androids 4-6, but you need to open the device a special way. Kuldeep Singh Dhaka和Martin Marinov修改了版本,使之适用于Android 4-6的用户,但是您需要以特殊方式打开设备。 Instructions are in Kuldeep's GitHub repo. 说明在Kuldeep的GitHub存储库中。

As far as I'm aware, no-one as of yet has got a modified version of libusb running on Android N. 据我所知,到目前为止,还没有人在Android N上运行过libusb的修改版。

If you can get it working, please post on the mailing list. 如果可以使用,请在邮件列表中发布。 Everyone would love to hear how you did it. 每个人都希望听到您的操作方式。

~Chris 〜克里斯

You Must Use LibUsb Version v1.0.23 +您必须使用LibUsb 版本 v1.0.23 +

Then libusb_init to initialize success.然后libusb_init初始化成功。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM