我有几个供应商.so
库,它们应该存在于应用程序的.apk
中,由高通硬件在运行时加载。它们不与我的任何C++代码链接,也不与设备的ABI绑定(arm64-v8a
和armeabi-v7a
的库文件相同)。
我不确定如何通过Android.mk
将此类库添加到应用程序包中。例如,当我这样做时
# My project
...
LOCAL_SHARED_LIBRARIES += snpe_dsp_v65_domains_v2_skel
# Library definition
include $(CLEAR_VARS)
LOCAL_MODULE := snpe_dsp_v65_domains_v2_skel
LOCAL_SRC_FILES := $(SNPE_SDK_PATH)/lib/dsp/libsnpe_dsp_v65_domains_v2_skel.so
include $(PREBUILT_SHARED_LIBRARY)
我得到libsnpe_dsp_v66_domains_v2_skel.so is incompatible with aarch64linux
错误。据我所知,它试图链接到这个库,这不是我想要的,我只想把它添加到包中。如果我从LOCAL_SHARED_LIBRARIES
中省略了这个库,它既不会链接到也不会添加到包中,我通过观察<project_path>\build\intermediates\ndkBuild\debug\obj\local\arm64-v8a\
位置的库来检查
--编辑--
好的,我确实通过普通的Makefile cp
命令复制了这些库,它们最终在.apk
文件中。
include $(CLEAR_VARS)
LOCAL_MODULE := snpe_dsp_v65_domains_v2_skel
LOCAL_SRC_FILES := $(SNPE_SDK_PATH)/lib/dsp/libsnpe_dsp_v65_domains_v2_skel.so
$(shell cp $(LOCAL_SRC_FILES) $(TARGET_OUT))
include $(PREBUILT_SHARED_LIBRARY)
尽管除了$(shell cp $(LOCAL_SRC_FILES) $(TARGET_OUT))
之外的所有内容都不是必需的
不幸的是,在此之后,供应商的代码无法在运行时加载它们:
E/com.example.example: vendor/qcom/proprietary/commonsys-intf/adsprpc/src/fastrpc_apps_user.c:1844: Error: Device node open failed for domain 3 (errno Permission denied)
E/com.example.example: vendor/qcom/proprietary/commonsys-intf/adsprpc/src/fastrpc_apps_user.c:2158: Error 0x57: apps_dev_init failed for domain 3, errno Permission denied
E/com.example.example: vendor/qcom/proprietary/commonsys-intf/adsprpc/src/fastrpc_apps_user.c:2254: Error 0x57: open_dev (-1) failed for domain 3
E/com.example.example: vendor/qcom/proprietary/commonsys-intf/adsprpc/src/fastrpc_apps_user.c:1053: Error 0x57: remote_handle64_open failed for file:////data/app/com.example.example-qP0bP5ry9PqK3iQ1YKmeJg==/base.apk!/lib/arm64-v8a/libsnpe_dsp_v66_domains_v2_skel.so?snpe_dsp_domains_v2_skel_handle_invoke&_modver=1.0&_dom=cdsp
W/OVR::Main: type=1400 audit(0.0:1165): avc: denied { read } for name="adsprpc-smd-secure" dev="tmpfs" ino=1131 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:xdsp_device:s0 tclass=chr_file permissive=0
E/com.example.example: vendor/qcom/proprietary/commonsys-intf/adsprpc/src/fastrpc_apps_user.c:1844: Error: Device node open failed for domain 3 (errno Permission denied)
E/com.example.example: vendor/qcom/proprietary/commonsys-intf/adsprpc/src/fastrpc_apps_user.c:2158: Error 0x57: apps_dev_init failed for domain 3, errno Permission denied
E/com.example.example: vendor/qcom/proprietary/commonsys-intf/adsprpc/src/fastrpc_apps_user.c:2254: Error 0x57: open_dev (-1) failed for domain 3
E/com.example.example: vendor/qcom/proprietary/commonsys-intf/adsprpc/src/fastrpc_apps_user.c:1053: Error 0x57: remote_handle64_open failed for file:///libsnpe_dsp_v66_domains_v2_skel.so?snpe_dsp_domains_v2_skel_handle_invoke&_modver=1.0&_dom=cdsp
使用System.loadLibrary("snpe_dsp_v66_domains_v2_skel");
从Java加载也不起作用,因为正如我所指出的,这些库是为完全不同的ABI构建的,应该由供应商的代码加载
1条答案
按热度按时间ycl3bljg1#
您不需要(也不应该)在www.example.com中执行任何操作Android.mk来提供预构建的供应商库,只需将这些库添加到
app/src/main/jniLibs/$ABI
目录中,类似于将asan库打包到https://developer.android.com/ndk/guides/asan中。