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