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

rub*_*bmz 3 android-ndk

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

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

mst*_*sjo 8

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

如果MediaCodecAPI在您的应用程序中是可选的,并且您可以在Android 21+上使用它们,那么您可以确保将其构建到单独的lib(如libyourapp-media.so)中,并准备好处理该案例什么时候System.loadLibrary()这个库失败了.

但是,如果要在应用程序中使用其他本机代码组件,则需要了解一些问题.如果您构建应用程序定位android-21并且您的本机代码使用某些功能(例如atof),它将仅运行android-21或更新(即使使用该功能的代码atof将为旧平台构建正常).原因是该atof函数之前不存在,并且对它的调用被重定向到strtod.如果您构建库目标android-21,它实际上会执行atof相反的调用,这在较旧的平台版本中不存在.这也适用于许多其他功能,不仅如此atof.有关详细信息,请参见http://b.android.com/73725.

因此,如果要在可以在旧版本上加载的库中使用新的本机媒体API(显然无法在旧版本上运行的本机媒体API除外),则需要构建针对较旧版本的本机组件android版本.您需要复制media/*标题android-21,但不是链接到libmediandk.so(-lmediandkin LOCAL_LDLIBS),而是需要在运行时使用加载此库dlopen.

如果您还需要在旧平台上执行相同操作,则应使用MediaCodecjava中的API(可以通过JNI调用).然后,只需要在Android 21+上使用原生版本的API,就可以在所有版本上使用java API(从Android 16开始工作,从Android 18开始就更可靠) .