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

时间:2015-01-11 22:31:42

标签: android-ndk

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

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

1 个答案:

答案 0 :(得分:8)

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

如果MediaCodec API在您的应用中是可选的,并且您可以在Android 21+上使用它们,那么您可以确保将其构建到单独的lib(如libyourapp-media.so) ,并准备好处理此库的System.loadLibrary()失败时的情况。

但是,如果您想在应用中使用其他原生代码组件,那么您需要了解一些问题。如果您构建定位android-21的应用并且您的本机代码使用某些功能(例如atof),则它只会在android-21或更新版本上运行(即使代码使用函数{{1}对于旧平台来说,它可以很好地构建。这样做的原因是之前atof函数不存在,并且对它的调用被重定向到atof。如果您构建定位strtod的库,它实际上会调用android-21,而旧平台版本中并不存在。这也适用于许多其他功能,而不仅仅是atof。有关详细信息,请参阅http://b.android.com/73725

因此,如果您想在可以在旧版本上加载的库中使用新的本机媒体API(除了显然不能在旧版本上工作的本机媒体API之外),您需要构建针对较旧的Android版本的本机组件。您需要复制来自atof的{​​{1}}标题,但不是链接到media/*android-21中的libmediandk.so),而是' d需要使用-lmediandk在运行时加载此库。

如果您还需要在旧平台上执行相同操作,则应使用java中的LOCAL_LDLIBS API(可以通过JNI调用)。然后,只需要在Android 21+上使用原生版本的API,就可以在所有版本上使用java API(它可以在Android 16上运行,并且更可靠)自Android 18以来。