原文:android-ndk-r5\docs\STABLE-APIS.html
一些“API的级别”定义。每个级别的AP对应一个给定的Android版本,目前支持:
android-3 -> 官方Android
1.5 系统映像 (C、C++、Math、Log、Zlib)
android-4 -> 官方Android
1.6 系统映像 (OpenGL ES 1.x)
android-5 -> 官方Android
2.0 系统映像 (OpenGL ES 2.0)
android-6 -> 官方Android
2.0.1 系统映像
android-7 -> 官方Android
2.1 系统映像 android-8 -> 官方Android
2.2 系统映像 (jnigraphics)
android-9 -> 官方Android
2.3 系统映像 (OpenSL
ES、android)
请注意,android-6和android-7和android-5相同,即他们的本地API是完全一样的!
什么级别有什么头文件,在下面路径下可以找到:
$NDK/platforms/android-/arch-arm/usr/include
二、Android-3 Stable Native APIs:
下面列出的所有API是用于开发NDK代码,可用于运行在Android 1.5系统的及以后版本.
(1)C库:
C库的头文件,在Android
1.5中定义的可用通过他们标准名称找到(/,中,等..).
如果一个头在构建时不存在,可能是在1.5班中中没有实现
编译系统自动链接C库到您的本机模块,您不必将它添加到LOCAL_LDLIBS.
请注意,机器人C库包含的pthread()的支持, 所以“LOCAL_LIBS:= - lpthread”是没有必要的。
(2)数学库:
是可用的,在构建时.数学库会自动链接到您的本地代码中,
所以不需要指定LOCAL_LDLIBS := -lm
(3)C++库:
C++非常小的一部分API是支持的.对于Android 1.5,仅允许下列头文件:
他们不可能包含所有标准的定义.
值得注意的是,在Android 1.5中,C++异常和RTTI支持是不可用。
C++支持库(-lstdc++)是自动链接到你的本地代码中,
所以不需要指定LOCAL_LDLIBS
(4)Android
Log:
包含可用于从您的本机代码中发送各种定义日志的信息。
请您看其内容(build/platforms/android-3/common/include/android/log.h),其中包含如何使用它.
您应该写一个宏来包装他们,以方便使用.
如果你使用它,你的本机模块应该链接/system/lib/liblog.so:
LOCAL_LDLIBS:= -llog
(5)Zlib压缩库:
和可以使用,可用于使用了zlib压缩库。
如果你使用它,你的本机模块应该链接/system/lib/libz.so:
LOCAL_LDLIBS := -lz
(6)动态链接库:
可以使用,dlopen()/dlsym()/dlclose()
提供的Android动态链接器功能。您将需要链接/system/lib/libdl.so:
LOCAL_LDLIBS := -ldl
三. Android-4 Stable Native APIs:
下面列出的所有API是用于开发本机代码,可用于运行在Android 1.6系统的及以后版本.
(1)OpenGL ES
1.x的库:
标准的OpenGL
ES的头文件和,
如果您使用它们,你的本机模块应该链接到/system/lib/libGLESv1_CM.so,如:
LOCAL_LDLIBS := - lGLESv1_CM
'1.X'号是指OpenGL ES API的两个版本1.0和1.1。 请注意:
- OpenGL ES
1.0是支持所有的Android设备
- OpenGL ES
1.1完全支持相应的图形处理器特定的设备
是因为Android1.0使用相对较少的设备.
开发人员应该查询OpenGL ES版本字符串和扩展名字符串,如果知道当前设备支持哪些东西。
参见glGetString()的说明,以了解如何做到这一点:
http://www.khronos.org/opengles/sdk/1.1/docs/man/glGetString.xml
此外,开发者必须在manifest.xml中指明标签,说明应用程序使用 哪些OpenGL ES版本。有关详细信息,请查看下面链接的信息:
http://developer.android.com/guide/topics/manifest/uses-feature-element.html
请注意,目前,本地的头文件和库在 EGL APIs是不可用.
EGL是用于执行平面创建和翻转(而不是渲染).
相应的操作必须要在您的应用程序而不是虚拟机。
四、Android-5 Stable Native APIs:
下面列出的所有API是用于开发本机代码,可用于运行在Android 2.0系统的及以后版本.
(1)OpenGL ES
2.0库:
标准的OpenGL ES
2.0的头文件和,
在本地调用中,要包含声明需要执行从本地代码调用的OpenGL ES 2.0渲染
这包括定义顶点和片段着色器的使用的GLSL的语言。
如果您使用它们,你的本机模块应该链接到/system/lib/libGLESv2.so如:
LOCAL_LDLIBS := -lGLESv2
并非所有设备都支持OpenGL ES 2.0,开发人员应该这样查询 实现的版本和扩展字符串,见上文第三节详情。
请注意,目前,本地的头文件和库在 EGL
APIs是不可用.
EGL是用于执行平面创建和翻转(而不是渲染).
相应的操作必须要在您的应用程序而不是虚拟机。
重要注意事项: Android模拟器不支持OpenGL ES 2.0的硬件.
如果运行和测试代码,使用这个API需要真实的设备.
(意思使用这个OPenGL的库,必须真机运行或调试)
五、Android-8 Stable Native APIs:
下面列出的所有API是用于开发本机代码,可用于运行在Android 2.2系统的及以后版本.
(1)'jnigraphics'库:
这是一个很小的库,展示一个稳定的,基于C语言的,接口,使 本机代码安全地访问Java对象的像素缓冲区的位图.
使用它,在你的源代码中包含,并链接库jnigraphics:
LOCAL_LDLIBS + = -ljnigraphics
详细信息,请阅读bitmap.h:
build/platforms/android-8/arch-arm/usr/include/android/bitmap.h
简单地说,典型的使用应该是这样的:
1 根据JNI位图句柄,然后使用AndroidBitmap_getInfo()来检索有关信息 (例如它的宽度/高度/像素格式)
2 使用AndroidBitmap_lockPixels()来锁定像素缓冲区和指针。
直到AndroidBitmap_unlockPixels()被调用之前可确保像素
不被移动???
3 修改像素缓冲区,本地代码中根据其像素格式,宽度,步幅等
4 调用AndroidBitmap_unlockPixels()来解锁缓冲区。
六、Android-9 Stable Native APIs:
下面列出的所有API是用于开发本机代码,可用于运行在Android 2.3系统的及以后版本.
(1)OpenSL
ES的音频库:
使用它,在你的源代码中包含和.
包含需要从本地端的Android执行音频输入和输出的声明.
注意:尽管目前OpenSL
ES的规范使用,
目前Khronos的修改了,使用该文件建议包含,
以后使用这个库使用Android的方案
这个API版本也提供Android的特定扩展,详情请参看
和
该系统库命名为“libOpenSLES.so”,它在本地代码中实现了音频功能。
在你的模块使用以下链接:
LOCAL_LDLIBS + = - lOpenSLES
(2)Android的本地应用程序的APIs:
从API 9起,有可能完全写一个Android本机代码应用程序(即没有任何Java).
这并不意味着您的代码不运行在虚拟机,
虽然,大部分的功能在该平台将仍然需要通过JNI访问.
更多的关于这个主题的信息,
请阅读docs/NATIVE-ACTIVITY.html(TODO:写文档)
下面的头文件是新增的本地API:
活动生命周期管理(和入口点)
直接从本地代码监听和传感器的输入事件
窗口管理,包括能够锁定/解锁像素,可在缓冲区中操作.
直接(只读)访问您的.apk文件嵌入资源或 在不透明的二进制(OBB)文件,允许分配应用程序
大量的数据在.apk外.
(对于开发游戏是非常有用的,例如)
相应的功能函数在"libandroid.so"库中,
API 9才能使用.要使用它,使用以下配置:
LOCAL_LDLIBS + = - landroid