在安卓上连接更新的库

6
我开发了一款 Android 应用程序和本地库。该本地库使用 openSL ES 进行音频处理。
在我的 Android.mk 文件中,我有以下语句:
LOCAL_LDLIBS := -lOpenSLES

所以我猜这意味着应用程序将在装载/执行时动态链接到设备的system/lib文件夹中的openSLES库?

我面临的问题是设备上的库存在错误,而我有三个更新的库包含错误修复。如果可能,我该如何确保我的本地库正在使用我拥有的这三个库:

Libwilhelm.so
libOpenMAXAL.so
libOpenSLES.so

我只需要替换吗?

LOCAL_LDLIBS := -lOpenSLES

使用

LOCAL_SHARED_LIBRARIES := -lOpenSLES -lOpenMAXAL -lwilhelm
1个回答

4
只要你的目标是特定设备或非常有限的设备,所提出的解决方案就足够好了。但如果你的目标是一款公共应用程序,在不同平台上安装,包括未来的 Android “N” 版本和定制的 ROM,例如三星,你应该注意这些库的系统依赖性。
虽然 OpenSLES 和 OpenMAXAL 是无辜的(它们只依赖于 liblog 和 libwilhelm),但后者需要更多的关注。
看着 Android.mklibwilhelm 依赖于 liblog libutils libmedia libbinder libstagefright libstagefright_foundation libcutils libgui libdl libeffectslibstagefright_http_support
只有libloglibdl是“官方”的(即 NDK 的一部分)。其他依赖于平台,它们导出的函数可能对运行相同平台级别的不同设备不兼容。
为了保险起见,我建议只引入修复程序,并在可能的情况下继续使用系统版本的libwilhelm。希望您能以此方式减少系统依赖。

那么我应该如何确保我的应用程序使用我的版本的libOpenSLES.so而不是系统/ libs中有缺陷的版本呢?具体来说,我的Android.mk文件应该是什么样子的? - user1884325
是的,如果您在LOCAL_SHARED_LIBRARIES中指定它,它将与您的APK一起安装在设备上。在最近的Android版本中,它将自动加载。在旧版本中,加载程序可能更喜欢从系统目录加载库,因此您可以使用显式的System.loadLibrary()或dlopen()。 - Alex Cohn
当你说“older”时,我们是指4.4.2之前的版本吗?而你所说的“自动加载”,是指我的本地共享库将会被自动加载?当应用程序在设备上启动时,我该如何验证库实际被加载的位置? - user1884325
哦,你可以看到logcat。而且更旧的-我不记得确切的版本,但KitKat肯定是“好的一面”。 - Alex Cohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接