我正在开发一个大量使用 NDK 的 Android 应用程序。在 Java 方面,我们的目标是 SDK 19,最小 SDK 为 16。有没有办法在 NDK 方面做类似的事情?
现在我们的Application.mk文件有APP_PLATFORM := android-16
。有没有办法以平台 19 为目标,但在 NDK 端仍然兼容回 16?
这是可行的,但并不容易。
对于 java 代码,如您所知,您可以设置任何更高的目标 SDK 版本并使用此类功能,只要您确保这些代码路径仅在较新的设备上执行 - 简单。
对于本机代码,原则上可以设置更高APP_PLATFORM
比你的基线,并尝试做同样的事情,但你需要跟踪一些细节:
您不能无条件链接到新平台的函数,您需要动态加载它们。也就是说,不是直接调用函数并将库添加到LOCAL_LDLIBS
,您需要通过加载函数dlopen
and dlsym
相反,以确保二进制文件可以在旧版本上加载。 (或者,您可以构建单独的共享库,其中一个共享库可以在所有平台上加载,而另一个共享库只能在较新的平台上加载。)
一些仿生libc函数发生了变化(主要是android-21
,但在此之前也发生了一些较小的变化) - 之前确实存在但已更改符号名称的函数。已更改的最常见功能之一是rand
- 之前android-21
, rand
是一个实际调用的内联函数lrand48()
,所以你的二进制文件最终取决于lrand48
存在于旧的 Android 版本中'libc.so
,虽然他们没有任何rand
那里。在android-21
,添加了很多这样的函数,并且删除了内联函数,所以如果您使用APP_PLATFORM := android-21
,你的二进制文件最终将取决于函数rand
以前不存在。看https://stackoverflow.com/a/27093163/3115956 and https://stackoverflow.com/a/27338365/3115956有关此的更多详细信息。
请记住,您不需要设置APP_PLATFORM
与java端的目标SDK相同,如果您想在较新的固件版本上选择性地使用较新的功能,您(可能)只需要设置它。
由于第二个问题,您可能不想设置更高的值APP_PLATFORM
根本不。如果你使用dlopen
(所以你实际上并不需要.so
文件来链接),您可以通过将这些新标头从较新的平台版本复制到您自己的项目中并使用较旧的项目进行构建来非常轻松地进行管理APP_PLATFORM
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)