ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 Android 上构建与集成 Intel RealSense SDK:AAR 库构建与 Java/Native 应用开发实战

在 Android 上构建与集成 Intel RealSense SDK:AAR 库构建与 Java/Native 应用开发实战 在 Android 上构建与集成 Intel RealSense SDKAAR 库构建与 Java/Native 应用开发实战【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense本指南完整讲解如何在 Android 平台上构建与使用 Intel RealSense SDK 2.0librealsense既包含通过 Gradle 命令行与 Android Studio 两种方式从源码产出librealsense.aar的完整流程也包含将 AAR 集成进 Java 应用、以及通过 JNI 在 NativeC/C应用中链接librealsense2.so的实战方案。读完本文你将掌握 Android 端 RealSense 应用的工程配置、设备发现回调、Pipeline 深度流采集等核心能力并能对照仓库源码理解其权限申请与 USB 设备过滤的底层机制。Android 平台支持概览RealSense SDK 2.0 的 Android wrapper 允许开发者同时构建原生C/C与 Java 两种形态的 Android 应用。其核心交付物是一个名为librealsense.aar的 Android Archive 包应用通过将它加入 Gradle 依赖即可使用 SDK。AAR 文件承担两类职责负责获取摄像头访问权限以及提供基于 JNI 的 RealSense Java API见 doc/android.md。在使用 SDK 之前需要准备以下硬件与软件前提Android 目标设备系统版本 6.0且支持 OTG 特性Android Studio IDEUSB3 OTG 连接线用于将 RealSense 设备与 Android 设备相连。需要说明的是SDK 2.0 已在 Windows 与 Linux 平台上经过官方验证Android 平台虽未显式验证但预期可正常工作此外用于生产与制造流程的标定Calibration和固件更新Firmware update工具目前暂不支持在 Android 平台使用。构建 RealSense AAR 库构建入口位于仓库的wrappers/android目录该目录是一个独立的 Gradle 多模块工程。打开 settings.gradle 可以看到工程名为LRS除了核心库模块:librealsense外还包含了:tools:camera工具模块以及:examples:capture、:examples:playback、:examples:recording、:examples:processing、:examples:multicam、:examples:sensor、:examples:stream_pipeline_callback等示例模块构建时可按需选择。方式一Gradle 命令行构建在librealsense_root_dir/wrappers/android目录下执行Windows 主机gradlew assembleReleaseLinux 主机./gradlew assembleRelease构建成功后生成的 AAR 位于librealsense_root_dir/wrappers/android/librealsense/build/outputs/aar仓库已内置gradlew与gradlew.bat包装脚本因此无需预先安装特定版本的 Gradle脚本会依据工程配置自动下载所需版本。方式二Android Studio 构建安装并启动 Android Studio克隆最新的 RealSense SDK 2.0 源码到宿主机在 Android Studio 中打开 Android 工程Menu Bar → File → Open选择wrappers/android目录即包含 settings.gradle 的项目根目录在 Gradle 任务面板中运行:librealsense → build → assembleRelease。由于库需要针对 4 种不同的 ABI应用处理器架构分别编译整个构建过程会持续几分钟。构建成功后产物同样位于librealsense_root_dir/wrappers/android/librealsense/build/outputs/aar。构建完成后也可以在 Android Studio 顶部的 Configuration 下拉框中选择任意示例应用如 capture、recording、playback 等连接目标手机后直接运行。构建系统内部结构Android 端的构建链由 Gradle 与 CMake 协作完成各配置文件职责如下gradle.properties工程级 Gradle 配置。关键项包括android.useAndroidXtrue启用 AndroidX、android.enableJetifiertrueJetifier 兼容转换以及org.gradle.jvmargs-Xmx1536m为 Gradle 守护进程分配 1536MB 堆内存满足大体积原生编译需求config.cmake定义 CMake 变量。LRS_ROOT_DIR指向仓库根目录${CMAKE_CURRENT_LIST_DIR}/../../LRS_ANDROID_ROOT_DIR指向wrappers/android供各模块 CMake 引用librealsense/CMakeLists.txt库模块的 CMake 入口要求 CMake 最低版本 3.10通过add_subdirectory(${LRS_ROOT_DIR} ...)将整个 librealsense 根目录纳入构建并将产物输出到build/jniLibs/${ANDROID_ABI}从而以每个 ABI 一个子目录的形式生成对应架构的librealsense2.so。从该结构可以推断AAR 内的 JNI 库是直接以根目录 CMake 工程为蓝本、按ANDROID_ABI参数化后逐架构编译的因此assembleRelease的耗时与多 ABI 编译次数成正比。在 Android 应用中集成 librealsense官方提供了两个独立的示例工程分别演示 Java 与 Native 两种集成路径重点展示 Gradle 配置并保持业务代码最小化。完整说明见 Java 示例 与 Native 示例也可以先按上文从源码构建 AAR再将其作为本地依赖引入。方式一Java 应用java_example模块 build.gradle 配置在应用模块的build.gradle中添加仓库与依赖repositories { maven{ url https://egiintel.jfrog.io/artifactory/librealsense } } dependencies { implementation com.intel.realsense:librealsense:2.aar }2.表示使用任意大于 2.0.0 的版本生产环境建议锁定具体版本例如implementation com.intel.realsense:librealsense:2.18.0aar完成 Gradle 同步后即可导入 librealsense 类。若出现类导入失败可尝试通过 File → Invalidate Caches → Invalidate and Restart 清理缓存后重试。应用 Manifest 权限针对 Android 9API 28及以上版本的目标设备需要在应用清单文件中声明摄像头权限低版本目标应用非必需uses-permission android:nameandroid.permission.CAMERA/初始化与设备监听RsContext.init必须在应用生命周期内、与任何物理 RealSense 设备交互之前调用一次对于多 Activity 应用应使用 Application Context 而非 Activity ContextRsContext.init(getApplicationContext());通过DeviceListener注册设备插入/拔出通知。示例中在设备接入后启动采集线程拔出时中断线程mRsContext new RsContext(); mRsContext.setDevicesChangedCallback(new DeviceListener() { Override public void onDeviceAttach() { mStreamingThread.start(); } Override public void onDeviceDetach() { mStreamingThread.interrupt(); } });使用 Pipeline 采集深度帧//Start streaming and print the distance of the center pixel in the depth frame. private void stream() throws Exception { Pipeline pipe new Pipeline(); pipe.start(); final DecimalFormat df new DecimalFormat(#.##); while (!mStreamingThread.isInterrupted()) { try (FrameSet frames pipe.waitForFrames()) { try (Frame f frames.first(StreamType.DEPTH)) { DepthFrame depth f.as(Extension.DEPTH_FRAME); final float deptValue depth.getDistance(depth.getWidth()/2, depth.getHeight()/2); runOnUiThread(new Runnable() { Override public void run() { TextView textView findViewById(R.id.distanceTextView); textView.setText(Distance: df.format(deptValue)); } }); } } } pipe.stop(); }资源管理是 Android 端开发的关键由于 SDK 持有原生硬件资源必须确定性地对对象尤其是Frame派生对象调用close否则垃圾回收器无法跟上新帧的分配速度会造成内存持续增长。因此示例中充分利用了try(...)资源语法。上述代码涉及的Pipeline、FrameSet、Frame、DepthFrame、StreamType、Extension等类的完整实现位于 wrappers/android/librealsense/src/main/java/com/intel/realsense/librealsense/例如 Pipeline.java、DepthFrame.java。方式二NativeC/C应用native_example原生应用除依赖 AAR 中的动态库外还需要头文件才能编译 C/C 代码。下载动态库与头文件在模块build.gradle中定义独立的下载配置分别拉取.aar与.zip内含头文件repositories { maven{ url https://egiintel.jfrog.io/artifactory/librealsense } } configurations { downloadHeader downloadSo } dependencies { def version 2. downloadSo com.intel.realsense:librealsense: version aar implementation com.intel.realsense:librealsense: version aar downloadHeader com.intel.realsense:librealsense: version zip } task extractHeaders(type: Sync) { dependsOn configurations.downloadHeader from { configurations.downloadHeader.collect { zipTree(it) } } into $projectDir/src/main/cpp/include } task extractSo(type: Sync) { dependsOn configurations.downloadSo from { configurations.downloadSo.collect { zipTree(it) } } include(jni/**) into $buildDir/ } preBuild.dependsOn(extractHeaders) preBuild.dependsOn(extractSo)同样建议在生产中锁定具体版本例如def version 2.18.0。CMake 链接配置在应用的CMakeLists.txt中引入头文件目录并以 SHARED IMPORTED 方式声明librealsense2库include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp/include) add_library(realsense2 SHARED IMPORTED) set_target_properties( realsense2 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/build/jni/${ANDROID_ABI}/librealsense2.so ) target_link_libraries( native-lib ${log-lib} realsense2 )Manifest 中的 CAMERA 权限声明与 Java 示例一致。Java 侧 JNI 声明RsContext.init与DeviceListener的使用方式与 Java 示例相同不同之处在于设备接入后调用的是通过 JNI 暴露的原生函数int cameraCount nGetCamerasCountFromJNI(); String version nGetLibrealsenseVersionFromJNI();Native 侧实现读取 SDK 版本号宏RS2_API_VERSION_STR定义于 C 头文件extern C JNIEXPORT jstring JNICALL Java_com_example_realsense_1native_1example_MainActivity_nGetLibrealsenseVersionFromJNI(JNIEnv *env, jclass type) { return (*env).NewStringUTF(RS2_API_VERSION_STR); }查询已连接的设备数量使用 C APIrs2::contextextern C JNIEXPORT jint JNICALL Java_com_example_realsense_1native_1example_MainActivity_nGetCamerasCountFromJNI(JNIEnv *env, jclass type) { rs2::context ctx; return ctx.query_devices().size();; }源码级原理权限申请与 USB 设备过滤AAR 之所以能负责获取摄像头访问权限其机制可从 AndroidManifest.xml 一窥究竟。该清单文件注册了一个特殊的DeviceWatcherActivityactivity android:name.DeviceWatcherActivity android:themeandroid:style/Theme.NoDisplay android:directBootAwaretrue android:exportedtrue intent-filter action android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED / /intent-filter meta-data android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED android:resourcexml/usb_filter / /activity该 Activity 监听 Android 系统的USB_DEVICE_ATTACHED广播通过无界面主题Theme.NoDisplay静默拦截 RealSense 设备插入事件从而在系统层面发起 USB 权限请求。配合 usb_filter.xml 中声明的 Intel 设备厂商 ID 进行精确过滤resources usb-device vendor-id0x08086 / usb-device vendor-id0x08087 / usb-device vendor-id0x003E7 / /resourcesJava 侧的 RsContext.java 是这套机制的门面静态方法init(Context)惰性创建DeviceWatchersetDevicesChangedCallback将DeviceListener注册给 watcher底层通过 JNI 原生函数nCreate、nQueryDevices、nDelete等与librealsense2.so交互JNI 入口文件为 wrappers/android/librealsense/src/main/jni/rscontext.c。此外AAR 还内置了约 70 个 Java 类覆盖完整的 SDK 能力面设备与传感器Device、Sensor、DepthSensor、ColorSensor、流与帧StreamProfile、VideoFrame、Points、MotionFrame、后处理滤波器Colorizer、DecimationFilter、SpatialFilter、TemporalFilter、ThresholdFilter、HoleFillingFilter、HdrMerge、ZeroOrderInvalidationFilter、渲染GLRenderer、GLRsSurfaceView、GLVideoFrame、GLPointsFrame以及固件相关FwLogger、DebugProtocol、UpdateDevice等并预置了 presets 目录下的 16 份高级模式预设 JSON如DefaultPreset_D435.json、HighResHighAccuracyPreset.json等。仓库同时提供了 ExampleInstrumentedTest.java、JniPipelineTests.java 与 JniRsContextTests.java 等仪器化测试可在模拟器或真机上验证 JNI 层与 Java API 的基本行为是深入理解 Android 端实现的上佳入口。注意事项与限制版本前提目标设备需为 Android 6.0API 23及以上且支持 OTGCAMERA权限仅对 Android 9 及以上目标版本必需构建耗时AAR 需针对 4 种 ABI 逐一编译原生库请预留足够的构建时间与内存Gradle JVM 堆已配置为 1536MB资源释放务必对Frame等持有原生资源的对象显式调用close或使用try-with-resources否则可能因 GC 跟不上帧分配速度导致内存问题功能边界标定Calibration与固件更新Firmware update工具在 Android 平台暂不可用SDK 在 Android 上属于预期可用状态未像 Windows/Linux 那样经过官方显式验证生产使用前应在目标设备上充分测试。【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表