Android N libusb_init返回-1初始化libusb失败
我正在android应用程序中使用库。我构建了这个库,并为所有架构添加了*.so文件 我正在调用Android N libusb_init返回-1初始化libusb失败,android,c++,android-ndk,libusb,libusb-1.0,Android,C++,Android Ndk,Libusb,Libusb 1.0,我正在android应用程序中使用库。我构建了这个库,并为所有架构添加了*.so文件 我正在调用libusb_init初始化它,但它总是返回-1。我不确定这是许可问题还是什么 无法初始化libusb 我在库中看到libusb\u init方法代码: /** \ingroup lib * Initialize libusb. This function must be called before calling any other * libusb function. * * If you
libusb_init
初始化它,但它总是返回-1。我不确定这是许可问题还是什么
无法初始化libusb
我在库中看到libusb\u 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;
}
我使用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");
}
}
jstring Java_com_williams_poc_main activity_initUSB(JNIEnv*env,jobject thiz)
{
INTR;
__android_日志_打印(android_日志_信息,日志标签,“输入iniUSB”);
r=libusb_init(空);
if(r<0){
__android_日志_打印(android_日志_信息,日志标签,“未能初始化libusb”);
return(*env)->NewStringUTF(env,“未能初始化libusb”);
}否则{
__android_日志_打印(android_日志_信息,日志标签,“已成功初始化libusb”);
return(*env)->NewStringUTF(env,“libusb已成功启用”);
}
}
有人知道它什么时候返回-1吗?可能是什么问题?提前感谢。对于libusb来说,与Android 7+的兼容性是一个众所周知的问题 Kuldeep Singh Dhaka和Martin Marinov已经修改了版本,可以治疗Androids 4-6,但是你需要以一种特殊的方式打开设备。说明见Kuldeep的GitHub回购协议 据我所知,到目前为止,还没有人在安卓N上运行经过修改的libusb版本 如果你能让它工作,请张贴在邮件列表上。每个人都想知道你是怎么做到的
~Chris进入
usbi\u backend->init()
然后查看此“是”的480行,指向函数Yep的指针。它返回-1。你能猜到当调试一步进入usbi\u backend->init()
然后,^F一步进入
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");
}
}