2017-07-07 73 views
0

我在我的android应用程序中使用libusb库。我构建这个库并为所有体系结构添加* .so文件。Android N libusb_init返回-1未能初始化libusb

我打电话给libusb_init来初始化它,但它总是返回-1。我不确定这个权限问题或者是什么。

初始化失败的libusb

我看到里面库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; 
} 

我调试它,发现流程返回从该行上述方法的具有-1的代码。

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

我从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包装

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

有谁知道什么时候返回-1?可能是什么问题 ?提前致谢。

+0

步骤进'usbi_backend->的init()'然后 – pskink

+0

查看480行的这个https://github.com/Gritzman/libusb/blob/master/jni/usb/libusbi.h –

+0

是的,指向功能的指针 – pskink

回答

1

与Android 7+的兼容性是libusb的已知问题。

Kuldeep Singh Dhaka和Martin Marinov修改了Android版本4-6的版本,但您需要以特殊方式打开设备。说明在Kuldeep的GitHub回购中。

据我所知,没有人作为尚未得到了libusb的Android上N.

运行如果你能得到它的工作,请发表在邮件列表上的修改版本。每个人都希望听到你是如何做到的。

〜克里斯