问题标签 [vndk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
73 浏览

android - 在较新的 Android 构建中包含旧 Android 的预构建供应商库

我正在为现有手机构建一个新的 Android 版本(11,基于 LineageOS),并希望包含引用为旧 Android 版本 (9) 构建的 JNI 库的系统应用程序。

到目前为止,我所做的是将原始 jni lib 复制到其原始位置,/system/lib64/libfoojni.so并将应用程序作为预构建包含在 Android.mk 文件中:

到目前为止,这在升级到 Android 10 时有效,但对于 Android 11,libgui 和 libui 中的 ABI 中断会导致 libfoojni.so 导致崩溃。

据我了解 VNDK 设计,我应该能够将 VNDK 28 (Android 9) 甚至 VNDK 29 (Android 10) 版本的 libgui/libui 与 libfoojni.so 一起使用,但我不知道如何做到这一点。

作为libfoojni.so供应商库并且仅由该应用程序使用,我可以将其复制到/vendor/lib64甚至/system/priv-app/FooApp/lib/<arch>相反,结果完全相同。

所以我的问题基本上是:
我如何告诉 Android 或构建系统libfoojni.so或 FooApp.apk 通常应该使用版本 29 的 VNDK 库?

这甚至可能吗?

我尝试构建 libgui.so/libui.so 的修改版本,以恢复 ABI 重大更改并将其复制到/system/priv-app/FooApp/lib/<arch>其中并取得了一些成功,即它们被使用并且所有工作但并非总是如此:有时使用系统版本代替。

我什至不确定这是否可能,据我了解 VNDK 设计所使用的库的不同版本(即命名空间)由加载它们的二进制文件的位置决定,并且 APK 由系统进程加载,因此将属于系统名称空间,不是吗?或者(以某种方式?)将 APK 声明为属于供应商命名空间就足够了吗?