Android NDK和更新的API支持
我正在开发一款大量使用NDK的Android应用程序。在Java方面,我们的目标是SDK 19,最小SDK为16。在NDK方面有没有类似的方法 现在,我们的Application.mk文件具有Android NDK和更新的API支持,android,android-ndk,Android,Android Ndk,我正在开发一款大量使用NDK的Android应用程序。在Java方面,我们的目标是SDK 19,最小SDK为16。在NDK方面有没有类似的方法 现在,我们的Application.mk文件具有APP\u平台:=android-16。有没有办法瞄准平台19,但在NDK端仍与平台16兼容?看一看 例如,如果您不使用OpenGL ES 3.0和OpenGL ES 3.1 API,也不链接libGLESv3,则您的应用程序与API级别14兼容。请查看 例如,如果您不使用OpenGL ES 3.0和Ope
APP\u平台:=android-16
。有没有办法瞄准平台19,但在NDK端仍与平台16兼容?看一看
例如,如果您不使用OpenGL ES 3.0和OpenGL ES 3.1 API,也不链接libGLESv3,则您的应用程序与API级别14兼容。请查看
例如,如果您不使用OpenGL ES 3.0和OpenGL ES 3.1 API,也不链接libGLESv3,则您的应用程序与API级别14兼容。这是可行的,但并不太容易 对于java代码,如您所知,您可以设置任何更高的目标SDK版本并使用这些功能,只要您确保这些代码路径仅在较新的设备上执行—简单 对于本机代码,原则上您可以设置比基线更高的
APP_平台
,并尝试执行相同的操作,但您需要了解以下几个细节:
- 您不能无条件地链接到来自较新平台的函数,您需要动态加载它们。也就是说,您需要通过
和dlopen
加载函数,而不是直接调用函数并将库添加到dlsym
,以确保二进制文件可在旧版本上加载。(或者,您可以构建单独的共享库,其中一个共享库可以在所有平台上加载,而另一个共享库只能在较新的平台上加载。)LOCAL\u LDLIBS
- 一些仿生libc函数已经改变了(主要是在android-21中,但一些较小的函数在此之前也发生了改变)-以前确实存在但改变了符号名称的函数。较常见的函数之一是
——在rand
之前,android-21
是一个内联函数,实际调用了rand
,因此二进制文件最终取决于旧版本的lrand48()
libc中存在的
,而他们在那里没有任何lrand48
。在rand
中,添加了很多这样的函数,删除了内联函数,因此如果使用android-21
构建,二进制文件将取决于以前不存在的函数APP\u平台:=android-21
。有关此操作的更多详细信息,请参阅和rand
- 请记住,您不需要将
设置为与java端的目标SDK相同,如果您希望在较新的固件版本上选择性地使用较新的功能,您只需要(可能)设置它APP_PLATFORM
由于第二个问题,您可能根本不想设置更高的
APP\u平台。如果您使用dlopen
(因此您实际上不需要链接.so
文件),您可以非常轻松地管理这些新标题,方法是将这些新标题从较新的平台版本复制到您自己的项目中,并使用较旧的APP\u平台进行构建,这是可行的,但并不太容易
对于java代码,如您所知,您可以设置任何更高的目标SDK版本并使用这些功能,只要您确保这些代码路径仅在较新的设备上执行—简单
对于本机代码,原则上您可以设置比基线更高的APP_平台
,并尝试执行相同的操作,但您需要了解以下几个细节:
- 您不能无条件地链接到来自较新平台的函数,您需要动态加载它们。也就是说,您需要通过
dlopen
和dlsym
加载函数,而不是直接调用函数并将库添加到LOCAL\u LDLIBS
,以确保二进制文件可在旧版本上加载。(或者,您可以构建单独的共享库,其中一个共享库可以在所有平台上加载,而另一个共享库只能在较新的平台上加载。)
- 一些仿生libc函数已经改变了(主要是在android-21中,但一些较小的函数在此之前也发生了改变)-以前确实存在但改变了符号名称的函数。较常见的函数之一是
rand
——在android-21
之前,rand
是一个内联函数,实际调用了lrand48()
,因此二进制文件最终取决于旧版本的libc中存在的lrand48
,而他们在那里没有任何rand
。在android-21
中,添加了很多这样的函数,删除了内联函数,因此如果使用APP\u平台:=android-21
构建,二进制文件将取决于以前不存在的函数rand
。有关此操作的更多详细信息,请参阅和
- 请记住,您不需要将
APP_PLATFORM
设置为与java端的目标SDK相同,如果您希望在较新的固件版本上选择性地使用较新的功能,您只需要(可能)设置它
由于第二个问题,您可能根本不想设置更高的APP\u平台。如果您使用dlopen
(因此您实际上不需要链接.so
文件),您可以非常轻松地管理这些新标题,方法是将这些新标题从较新的平台版本复制到您自己的项目中,并使用较旧的APP\u平台构建超级酷的答案。我把这个和其他答案组合成一个组合答案:避免崩溃:NDK版本、minSdKVersion、targetSdkVersion和APP_平台(在project.properties中)超级酷的答案。我把这个和其他答案组合成一个组合答案:避免崩溃:NDK版本、minSdKVersion、targ