2017-07-07 6 views
0

J'utilise la bibliothèque libusb dans mon application Android. J'ai construit cette bibliothèque et ajouté des fichiers * .so pour toute l'architecture.Android N libusb_init renvoie -1 n'a pas réussi à initialiser libusb

J'appelle libusb_init pour l'initialiser mais il renvoie -1 toujours. Je ne suis pas sûr si ce problème de permission ou quoi.

n'a pas réussi à initialiser libusb

je vois code de méthode libusb_init à l'intérieur de bibliothèque:

/** \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 débogué et trouvé les retours d'écoulement à partir de cette ligne de procédé ci-dessus avec le code -1.

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

J'appelle ce à partir du code Java avec JNI wrapper

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

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

Est-ce que quelqu'un sait quand il retourne -1? Quel pourrait être le problème? Merci d'avance.

+0

pas dans 'usbi_backend-> init()' puis – pskink

+0

Voir 480 ligne de cette https://github.com/Gritzman/libusb/blob/master/jni/usb/libusbi.h –

+0

oui, le pointeur sur la fonction – pskink

Répondre

1

La compatibilité avec Android 7+ est un problème connu pour libusb. Kuldeep Singh Dhaka et Martin Marinov ont des versions modifiées qui fonctionnent un régal pour Androids 4-6, mais vous devez ouvrir l'appareil d'une manière spéciale. Les instructions sont dans le rapport GitHub de Kuldeep.

Pour autant que je sache, personne ne pour l'instant a obtenu un Si vous pouvez le faire fonctionner la version de libusb sous Android N.

modifié, s'il vous plaît poster sur la liste de diffusion. Tout le monde aimerait entendre comment vous l'avez fait.

~ Chris