Libusb库在Android下的使用例程

Android libusb库的使用 阅读详情

转载请注明:http://blog.youkuaiyun.com/hubbybob1/article/details/54863662
阅读本文前清先了解相关基础内容,操作步骤请阅读博客:libusb1.0在android内的移植和使用方法
在讲解了libusb库在Android下的移植和基本应用后,下面来讲解Libusb的Android工程;

其工程步骤:
1.建立带有JNI工程的eclipse工程,网上有很多教程
2.根据上一篇博客生成libusb.a库文件和相关头文件(libusb.h等),并导入JNI工程.
3.编写Android.mk,可以通过ndk-build进行编译C文件到工程里面去如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS
CROSS_DIR  := /opt/gstreamer
spice_objs := \
            $(LOCAL_PATH)/libs/lib/libusb.a

LOCAL_SRC_FILES := android-jni-interface.c

LOCAL_LDLIBS += $(spice_objs) -llog

LOCAL_C_INCLUDES += \
        $(LOCAL_PATH)/libs/include/libusb \
        $(CROSS_DIR)/include/glib-2.0 \
        $(CROSS_DIR)/lib/glib-2.0/include

#LOCAL_SHARED_LIBRARIES := libmyaudio

LOCAL_MODULE := libxxtest

include $(BUILD_SHARED_LIBRARY)

4.编写C文件并进行ndk-build编译,如下所示:

#include <jni.h>
#include <android/log.h>
#include <stddef.h>
#include "libusb.h"
#include <glib.h>
#define LOG_TAG "MediaRecorder"
#define LOG(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__)
//#define FALSE 0
JNIEXPORT void JNICALL
Java_com_example_testcusejava_Testcusenative_libusbcallfunc(JNIEnv* env, jobject obj)
{
    //openUsbDevice(4703,12587);
    int rc,r;
    libusb_device_handle *handle = NULL;
    libusb_device *device;
    libusb_context *ctx = NULL;
     r = libusb_init(&ctx);//启动libusb

     jclass class  = (*env)->FindClass (env, "com/example/testcusejava/Testcusenative");
    jmethodID openUsbDevice = (*env)->GetStaticMethodID(env, class, "openUsbDevice", "(II)I");//GetStaticMethodID GetMethodID,通过jni获取Java的方法openUsbDevice
    int fd =(*env)->CallStaticIntMethod(env, class,openUsbDevice ,4703,12587);//CallVoidMethod,CallStaticIntMethod调用openUsbDevice 获取fd
    LOG("!!!!!一二三!!!!! fd = %d",fd);
    __android_log_write(6, "android-service", "Trying to open USB device.get_usb_device_fd");
    //rc = libusb_open_fd(device, &handle,fd);//打开usb设备
    if (rc != 0) { __android_log_write(6, "channel-usbredir", "Failed to open USB device."); }

    //libusb_close(handle);
    libusb_exit(ctx); //结束libusb
}

5.编写Java程序

package com.example.testcusejava;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

import com.example.testcusejava.R;
import com.example.testcusejava.Testcusenative.MyThread2;
import com.example.testcusejava.Testcusenative.MyThread3;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbRequest;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

//bhw   2016.07.19 e

public class Testcusenative extends Activity {  
    public native void libusbfunc();// 调用native方法   
static {
        System.loadLibrary("xxtest");//加载ndk-build生成的libxxtest.so库
    }

    private Button button,button2;
    private UsbManager usbManager;
    private UsbDevice usbDevice;
    private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
    private PendingIntent pendingIntent;
    static int fd = -1;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            switch (msg.what) {
            case 3:
                Toast.makeText(Testcusenative.this, "33333333333333333", 0).show();
                break;
            case 4:
                Toast.makeText(Testcusenative.this, "44444444444444444", 0).show();
                break;

            }
        }
    };

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_testcusenative);           
        try {
            Process process = Runtime.getRuntime().exec("su");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
        button = (Button) findViewById(R.id.buttonPlay);
        usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);    
        pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        registerReceiver(mUsbReceiver, filter);

        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Log.e("device","call MyThread2 ");
                new MyThread2().start();

            //  libusbfunc();// 调用native方法              }
        });


    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.testcusenative, menu);
        return true;
    }


    public static native void test();
    static{
         //System.loadLibrary("lianyinbao-jni");
    }

    class MyThread2 extends Thread{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            try {
                UsbDevice ud= null;
                //链接到设备的USB设备列表
                HashMap<String, UsbDevice> map = usbManager.getDeviceList();

                Collection<UsbDevice> usbDevices = map.values();
                Iterator<UsbDevice> usbDeviceIter = usbDevices.iterator();
                while (usbDeviceIter.hasNext()){
                    ud = usbDeviceIter.next();  
                    //VendorID 和ProductID  十进制                  
                    if(4703 == ud.getVendorId() && 12587 == ud.getProductId()){//vid pid 3141 25409  ; 4703  12587
                   usbDevice = ud;
                   Log.e("device","find device"); //bhw                 
                    }
                    //Log.e("device","find device"); //bhw
                }

                //检测USB设备权限受否授权
                if(usbManager.hasPermission(usbDevice)){
                    handler.sendEmptyMessage(3);
                    new MyThread3().start();
                    Log.e("device","usbManager.hasPermission");//bhw
                }else{
                    //如果没有授权就授予权限
                    handler.sendEmptyMessage(4);
                    usbManager.requestPermission(usbDevice, pendingIntent); //在此Android系统会弹出对话框,选择是否授予权限                    
                    Log.e("device","usbManager.requestPermission");   //bhw                                                                     
                }               
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    class MyThread3 extends Thread{
        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            Log.e("device","MyThread3");//bhw
            UsbDeviceConnection connection = usbManager.openDevice(usbDevice);          
            fd = connection.getFileDescriptor();//获取文件描述符
            Log.e("device","MyThread3  "+fd);       
            jnicallfunc();//调用native方法                  }
    }
    public static int openUsbDevice(int vid, int pid) throws InterruptedException {

        Log.e("device","openUsbDevice  "+fd);
        return fd;

    }
    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.e( "action", action);

            if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    usbDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        handler.sendEmptyMessage(1)                  
                        if(usbDevice != null){
                          new MyThread3().start();//MyThread3
                       }
                    } 
                    else {
                        Log.d("denied", "permission denied for device " + usbDevice);
                    }
                }
            }
        }
       };   
}

当编写完后的运行结果如下图:
这里写图片描述
打印的信息顺序为下图:
这里写图片描述
到此主要的程序已经完毕,本程序eclipse的工程代码下载

Libusb在Android平台上的环境以及原理     一、环境:配置NDK环境 1、下载libusb源码:https://github.com/libusb/libusb/releases,如下图所示 2、删除一些和Android平台无关的文件,删除后的文件如下图所示: 思考问题: Android是怎么获取usb设备? 如上图所示:连接adb shell,然后cd到/sys/bus/usb/devices/目录,命令ll... 阅读详情

相关推荐

基于libusb库、uac协议,获取Audio声音数据

android_usbaudio 基于libusb,实现无驱动获取USBAudio 期望实现的功能: 通过libusb获取USBAudio数据,无需SELinux声卡权限 部分摄像头无法获取音频问题解决思路: 无法获取音频的原因:当前传过去的采样率在设备当前选择的Audio Interface中不存在! 描述:我们打开的设备声卡通道它当前自己有一个固定的采样率,主机这边传过去的采样率和设备当前的端点的采样率不匹配,就会导致拿不到音频数据 如:设备当前采样率为32000,主机传过去的采样率为48000

xyzahaha的博客 5122

Android/linux从usb声卡获取音频(使用libusb库)----环境,lsusb命令的介绍(一)

Android/linux从usb声卡获取音频(使用libusb库)---环境,lsusb命令的介绍(一) Android/linux从usb声卡获取音频(使用libusb库)---设备环境的确认(二) Android/linux从usb声卡获取音频(使用libusb库)---libusb库获取“纯麦”音频数据(三) Android/linux从usb声卡获取...

Canok 2724

Android平台下libusb实现UVC相机录像与拍照功能

libusb 是一个广泛使用的开源库,专为实现跨平台的 USB 设备通信而设计。它支持 Linux、Windows、macOS 和 Android 等多种操作系统,为开发者提供了统一的 API 接口,屏蔽了底层系统的差异性。UVC是USB标准化组织(USB-IF)制定的设备类规范之一,编号为。其核心在于定义了视频控制接口(Video Control Interface)和视频流接口(Video Streaming Interface)。

weixin_36064575的博客 1177

Android从USB声卡录制高质量音频-----使用libusb读取USB声卡数据

为了获取USB声卡数据,在网上进行了大量的文章搜索,发现USB的库都是使用C语言写的,使用比较多的应属libusb了。 参考https://github.com/shenki/usbaudio-android-demo.git 1、libusb简介 libusb是一种高级别的,底层的API,它封装了低级别的内核与USB模块的交互,并提供了一系列适合在用户空间进行usb驱动开发的函数。libu...

linzekai100的博客 8641

android上可用的libusb.so

基于libusb-1.0.3版本,经过ndk编译的,经测试在androis上可用

安卓下libusb编译

mk都整理好了,直接进入到相应的目录下使用ndk-build编译就可以了

libusb介绍及简单使用

libusb是一个开源的用C实现的,应用程序与用户的USB设备进行通信的库。它是可移植的,对外使用统一的API,支持Windows、macOS、Linux、Android。它是用户模式(user-mode),应用程序与USB设备通信不需要高权限,但是在Android下好像有些接口需要root权限才能调用成功。它支持所有版本的USB协议。它的License是LGPL,源码地址在https://git...

网络资源是无限的 4万+

android libusb 已经成功编译拿去能用

android libusb 已经成功编译拿去能用用ndk-build编译

ubuntu16.04 编译 libusb以及 使用libusb库编译hidapi库

首先,需要编译 libusb的库,然后依赖于 libusb的库,编译 hidapi的库 一.LIBUSB编译 1.下载 libusb的源码: git clone https://github.com/libusb/libusb.git 2.编译: 进入到跟目录下的android/jni目录下面,执行 ndk-build APP_ABI=armeabi-v7a,此处根据需要选取,armeabi需要比较老的ndk版本,然后会在jni的上层目录,即 android/libs/armeabi-v71/.

qq_30025621的博客 1954

【2025年五一数学建模竞赛】A题 完整论文 模型建立与求解

2025年五一数学建模竞赛 A题:基于历史数据与模式识别的道路车流量推测模型研究

Magnolia_He的博客 3783

qt工程引入opencv库步骤

第一步:新建qt工程 第二步:在工程名.pro文件中添加opencv库的路径                   INCLUDEPATH += /home/liyuanzhe/opencv-2.4.8/include/opencv \ /home/liyuanzhe/opencv-2.4.8/include/opencv2 LIBS += /home/liyuanzhe/open

superyuanzhe的专栏 5722

libusb android pc,libusb: android上集成libusb库

1.下载libusb库。2.添加libusb库到android studio项目中。这里以源码编译的方式添加,使用的仍然是ndk-build的方式,而非cmake,使用源码编译的好处在于,可以随时调试libusb库的源码,方便加log。2.1在app/src/main目录下新建一个jni目录,用于存放libusb库的源代码。2.2 打开app目录下的build.gradle文件,指定JNI...

weixin_39929465的博客 559

SuperMap iObjects Java组件开发——环境部署(IntelliJ IDEA)

SuperMap iObjects Java 是面向GIS应用系统开发者的组件式GIS开发平台,具有强大的地理数据管理、编辑、显示、分析等功能,并且其具有极强的易用性和丰富的帮助资源,适宜快速开发大型GIS应用系统。本文将介绍如何在IntelliJ IDEA集成开发环境中进行SuperMap iObjects Java组件的环境部署。

nan620403的博客 1081

Libusb在Android下的应用Eclipse工程:Android硬件通信利器

Libusb在Android下的应用Eclipse工程:Android硬件通信利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 Libusb在Android下的应用Eclipse工程是一个开源项目,旨在帮助Android开发者理解和应用Libusb库,实现与各种USB硬件设备的通信。该项目提供了一套完整的Eclipse工程示例,使得开发者能够快速上手,简化开发流程。...

gitblog_06762的博客 731

别再手动上传了!用宝塔面板的‘Let‘s Encrypt’免费SSL证书,3分钟自动续期

本文详细介绍了如何利用宝塔面板的‘Let‘s Encrypt’功能实现SSL证书的自动申请和续期,3分钟完成配置即可永久免费使用。通过对比不同SSL证书方案,突出Let's Encrypt的免费、自动续期和高安全性优势,特别适合个人博客和中小企业官网。

weixin_30415113的博客 150

UG\NX二次开发 替换部件引用集UF_ASSEM_replace_refset

替换部件引用集UF_ASSEM_replace_refset,需要替换成“完整部件(Entire Part)”需要第三个参数传入空指针或者空字符串。

王牌飞行员_里海的博客 255

第三方库LibUSB在Android系统上的简单使用

背景:公司开发一个USB设备的固件升级工具。1、为毛使用LibUSB库?因为使用Android Host API读取不到我想要的USB设备。有类似的兄弟姐妹们请看自定义HID设备与Android设备通信,看了这篇文章之后,是不是觉得可以不用了?是的,你们说得很对。可能会存在这个小概率事件——没有修改描述符的自定义设备已经发货到客户终端了,客户使用起来不爽,设备商于是更新了固件,需要在Android...

UPON的博客 1万+

【招商银行笔试题汇总】[全网首发]2024-04-23-招商银行春秋招笔试题-三语言题解(CPP/Python/Java)

🏳️ 难难难!!!本次招商银行的笔试算是今年春招最难的场次之一了K小姐所在的公司有 NNN 个部门,编号从 111 到 NNN。由于公司网络系统比较老旧,对于同一个数据 ddd,不同部门记录的值可能不同。数据 ddd 在各部门被记录为 d1,d2,...,dNd_1, d_2, ..., d_Nd1​,d2​,...,dN​。公司提出可以通过会议来实现数据的一致性。每次会议会让相邻编号范围内的所有部门一起参加,如果有超过半数的部门能够对数据 ddd 的值达成共识,那么在此次会议后,参与会议的所有部门会将

春秋招笔试突围 3463

libusb Android jni,libusb1.0在android内的移植和使用方法

libusb1.0在android内的移植和使用方法本文主要讲述的libusb在android下的移植和使用方法,并且在应用的方面可以举一反三转载著名:http://blog.youkuaiyun.com/hubbybob1/article/details/522449991.编译编译安卓版libusb库如下步骤:B.提取NDKC.打开终端并确保配置好的NDK为全局环境变量D.进入/libusb/androi...

weixin_39553776的博客 743

002、搭建你的第一个Agent开发环境:Python与核心库安装

在上一篇《Agent智能体开发入门:概念、应用与前景》中,我们描绘了Agent智能体的宏伟蓝图,理解了其作为“数字员工”的巨大潜力。然而,许多开发者在迈出第一步时,常常被复杂的依赖、版本冲突和晦涩的配置所劝退,空有想法却无从下手。这种感觉就像拿到了一张藏宝图,却找不到出发的港口。本文正是你的“启航指南”。我们将彻底解决这个痛点,通过一个清晰、可复现的流程,为你搭建一个专为Agent开发量身定制的Python环境。一个纯净、隔离的Python虚拟环境,避免项目间的“依赖地狱”。一套经过验证的核心工具链。

G_RE_RE的博客 111

DC Error: The power pin VDD on the cell UASA1/CG_X8_Rdsd2pcm is unconnected. (UPF-581)

【代码】DC Error: The power pin VDD on the cell UASA1/CG_X8_Rdsd2pcm is unconnected. (UPF-581)

baidu_34971492的博客 970

libusb 加入到 Android

1. 首先要把 usbfs 文件系统编入内核 1) 进入到 Android 源码根目录下 kernel 子目录: $cd kernel 2) 再配置 config(用的是 arch/arm/configs/omap3_beagle_android_defconfig): $make ARCH=arm omap3_evm_android_defconfig $make menuconfig 选中

JackXiongChina的专栏 2806

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Qt for android : libusb在android中使用

不需要root权限, Qt for Android调用libusb获取USB信息

听我一言的博客 3028

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android Studio 使用libusb(Cmake)

libusb 下载,下载地址:官网,下载完成后解压(当前最新版本1.0.23)。 Android studio 创建c++工程,并在cpp目录下创建libusb-support目录。 打开libusb源码,将libusb-1.0.23目录下的libusb拷贝到libusb-support目录,将libusb-1.0.23/android/config.h文件拷贝到libusb-support文件夹下。 整个项目文件结构如下图所示: 修改CMakeLists.txt。 查看libusb-1.0.23/an.

T_Ray的博客 2277

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Qt for Android : 使用libusb做CH340x串口传输的底层USB库

Qt for Android, 使用libusb做底层usb通讯库, 实现ch340x串口访问

听我一言的博客 1656

Android/linux从usb声卡获取音频(使用libusb库)---libusb库获取“纯麦”音频数据(三)

Android/linux从usb声卡获取音频(使用libusb库)---环境,lsusb命令的介绍(一)Android/linux从usb声卡获取音频(使用libusb库)---设备环境的确认(二)Android/linux从usb声卡获取音频(使用libusb库)---libusb库获取“纯麦”音频数据(三)Android/linux从usb声卡获取音频(使用libusb库)---libusb...

Canok 2721
上一篇: spice下通道OpenSSL加密的过程和加密数据传输过程解密
下一篇: 增加Android下spinner控件的点击下拉列表自动更新事件并实例应用--USB摄像头在spinner内下拉更新(一)
葫芦娃二娃
博客等级 码龄15年 1850粉丝 69原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值