2017-07-07 300 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.

運行如果你能得到它的工作,請發表在郵件列表上的修改版本。每個人都希望聽到你是如何做到的。

〜克里斯