是否可以将 lollipop 中引入的媒体 sdk (NDK) 用于 运行 on Android 16 + 的项目中

Is it possible to use media sdk (NDK) introduced in lollipop into a project to run on Android 16 +

我正在尝试使用 NDK 媒体 sdk 构建一个项目,但我也需要它 运行 在旧手机上(以支持 90% 的市场...)。现在,我可以手动包含 libmediasdk.so 和 libOpenMAXAL.so,并且似乎 link 正确,但我不确定这是正确的做法。 此外,库 (libmediasdk.so & libOpenMAXAL.so) 预计在目标设备上可用,因此除非我手动将它们复制到 project/libs/arch-arm,否则应用程序会抱怨找不到库。

我是不是走得太远了? :) 希望不会..

您可以编写可选地使用新的原生媒体函数 (libmediandk.so) 的代码,但您只能在 Android 21+ 上使用它。所以如果你想支持旧的 android 版本,你必须使这个代码路径可选,允许它在 libmediandk.so 不存在的其他设备上完全失败。

如果 MediaCodec API 在您的应用程序中是可选的,并且您可以接受它们仅在 Android 21+ 上可用,您只需确保将其构建到一个单独的库(如 libyourapp-media.so),并准备好处理此库的 System.loadLibrary() 失败的情况。

但是,如果您想在应用中使用其他本机代码组件,则需要了解一些注意事项。如果您针对 android-21 构建应用程序并且您的本机代码使用某些函数(例如 atof),它只会 运行 android-21 或更高版本(即使代码使用function atof 可以很好地构建旧平台)。原因是 atof 函数之前不存在,对它的调用被重定向到 strtod。如果您构建目标为 android-21 的库,它实际上会执行对 atof 的调用,这在旧平台版本中不存在。这也适用于许多其他功能,而不仅仅是 atof。有关详细信息,请参阅 http://b.android.com/73725

因此,如果您想在库中使用新的本机媒体 APIs,应该可以在旧版本上加载(除了本机媒体 APIs 显然不起作用在旧版本上),您需要构建针对旧 android 版本的本机组件。您需要从 android-21 复制 media/* headers,而不是链接到 libmediandk.so-lmediandk in LOCAL_LDLIBS),您d 需要在 运行 时间使用 dlopen.

加载此库

如果你也需要在旧平台上做同样的事情,你应该使用 java 中的 MediaCodec API(你可以通过 JNI 调用)。然后,当您可以在 java API 上使用 java API 时,仅仅为了在 Android 21+ 上使用本机版本的 API 就没有什么意义了所有版本(从 Android 16 开始工作,从 Android 18 开始更可靠)。