如何将共享库添加到Android NDK包中,而不尝试链接它

i7uaboj4  于 2023-02-17  发布在  Android
关注(0)|答案(1)|浏览(177)

我有几个供应商.so库,它们应该存在于应用程序的.apk中,由高通硬件在运行时加载。它们不与我的任何C++代码链接,也不与设备的ABI绑定(arm64-v8aarmeabi-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构建的,应该由供应商的代码加载

ycl3bljg

ycl3bljg1#

您不需要(也不应该)在www.example.com中执行任何操作Android.mk来提供预构建的供应商库,只需将这些库添加到app/src/main/jniLibs/$ABI目录中,类似于将asan库打包到https://developer.android.com/ndk/guides/asan中。

相关问题