Android NDK和更新的API支持

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

我正在开发一款大量使用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和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
    。有关此操作的更多详细信息,请参阅和

  • 请记住,您不需要将
    APP_PLATFORM
    设置为与java端的目标SDK相同,如果您希望在较新的固件版本上选择性地使用较新的功能,您只需要(可能)设置它


由于第二个问题,您可能根本不想设置更高的
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