# MyNative **Repository Path**: fythem/MyNative ## Basic Information - **Project Name**: MyNative - **Description**: JNI获取HAL接口 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-24 - **Last Updated**: 2022-02-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 功能 通过apk读取设备清单,获取供应商提供的专用HAL. ## 工具 Tinyxml2 (https://github.com/leethomason/tinyxml2) ## 相关概念 设备清单 (https://source.android.com/devices/architecture/vintf/objects?hl=zh-cn#device-manifest-file) 项目中对 "/vendor/etc/vintf/manifest.xml" 清单文件进行读取并解析,获取供应商提供的专用HAL接口 manifest.hal.name 的 HAL 指定实例的2种方法: 1) `xxx` 必须。指明软件包中具有实例名称的接口,可以有多个,但不能重复,一个当中,也可以有多个不重复的实例,也就是元素 2) `xxx` 可选。HAL指定实例的另一种方法 当前是根据 HAL 指定实例的第二种方法确定 HAL 接口,通过 `` 标签下的 `` 和 `fqname` 组合成 HAL 接口名称。 ``` 一个HAL接口的例子,接口为:'android.hardware.audio@5.0::IDevicesFactory/default' android.hardware.audio hwbinder 5.0 IDevicesFactory default @5.0::IDevicesFactory/default ``` 后续通过 android.hardware.details.getRawServiceInternal() 方法,获取该 HAL 接口对象 ## 编译时碰到的问题 报错:"xxx is not accessible for the namespace" 在进行dlopen的时候 "void *handle = dlopen("/system/lib64/libhidlbase.so", RTLD_NOW)", 报错如下: ``` E/linker: library "/system/lib64/libhidlbase.so" ("/system/lib64/libhidlbase.so") needed or dlopened by "/data/app/com.fy.mynative-hFgwbhWJv3EWF6HPMI3ERg==/base.apk!/lib/arm64-v8a/libmynative.so" is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_paths="/data/app/com.fy.mynative-hFgwbhWJv3EWF6HPMI3ERg==/lib/arm64:/data/app/com.fy.mynative-hFgwbhWJv3EWF6HPMI3ERg==/base.apk!/lib/arm64-v8a", permitted_paths="/data:/mnt/expand:/data/data/com.fy.mynative"] ``` 原因:谷歌从Android N开始, 限制了应用对系统私有库的加载。(https://developer.android.google.cn/about/versions/nougat/android-7.0-changes?hl=zh-cn#ndk) 解决办法:把应用需要加载的库和依赖的库从系统中pull出来,然后集成到自己的应用当中。 ## 结果 从 HUAWEI MatePad Pro 5G 上获取的可调用的12个 HAL ``` android.hardware.configstore@1.1::ISurfaceFlingerConfigs/default android.hardware.graphics.allocator@2.0::IAllocator/default android.hardware.media.omx@1.0::IOmx/default android.hardware.media.omx@1.0::IOmxStore/default android.hardware.neuralnetworks@1.2::IDevice/liteadaptor vendor.huawei.hardware.ai@1.3::IAiEngineService/hiaiserver vendor.huawei.hardware.ai@2.1::IAIService_hidl/hiaiserver_v2 vendor.huawei.hardware.ai@2.1::IModelManagerService_hidl/hiaiserver_modelmanager vendor.huawei.hardware.ai.hidlrequest@1.0::IHidlRequest/ai_fmk_hidl_service vendor.huawei.hardware.ai.hidlrequest@1.0::IHidlRequest/aiengine_server vendor.huawei.hardware.ai.om@1.0::IOmHidlBridge/default vendor.huawei.hardware.ai.stats@1.0::IAiStatsService/aiserver_record_stats ```