NDK工具

原创
2013/05/15 22:17
阅读数 1K

工欲善其事,必先利其器。先对ndk中提供的一些工具有所了解的话,一定会为我们后续的研究开发带来巨大的方便。以下就对ndk中一些工具的用法做一个简单的记录。

Development tools

The NDK includes a set of cross-toolchains (compilers, linkers, etc..) that can generate native ARM binaries on Linux, OS X, and Windows (with Cygwin) platforms.

It provides a set of system headers for stable native APIs that are guaranteed to be supported in all later releases of the platform:

  • libc (C library) headers
  • libm (math library) headers
  • JNI interface headers
  • libz (Zlib compression) headers
  • liblog (Android logging) header
  • OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
  • libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).
  • A Minimal set of headers for C++ support
  • OpenSL ES native audio libraries
  • Android native application APIS

The NDK also provides a build system that lets you work efficiently with your sources, without having to handle the toolchain/platform/CPU/ABI details. You create very short build files to describe which sources to compile and which Android application will use them — the build system compiles the sources and places the shared libraries directly in your application project.

Important: With the exception of the libraries listed above, native system libraries in the Android platform are not stable and may change in future platform versions. Your applications should only make use of the stable native system libraries provided in this NDK.

由这段可以了解到ndk本身支持的,并且会保证维持稳定的那些library。主要是非常基础的类库,及图形的OpenGL的library等。这大概也代表了native开发时ndk自身所存在的一些限制。当然,我们可以依据需要编译、链接进来任何我们想要的library。

NDK与Eclipse的集成

给Eclipse安装CDT插件,下载NDK包等,此处就不再详述了。直接使用android官网上提供的adt-bundle这种打包好Eclipse和SDK的工具也不错。

NDK包的解压缩路径有一点需要注意,NDK的整个路径中都不能包含空格。即NDK的任何一级父目录的folder name中都不包含空格。否则的话,在执行ndk-build时就会报错:


以NDK提供的sample 工程hello-neon为例。

ndk-build 的集成

1、把工程导入到Eclipse


方法为:New -> Project... ,打开“New Project”对话框:


选中“Android”->“Android Project from Existing Code”,然后点击“Next”。进入到“Import Projects”的对话框。


点击“Browser”,找到sample工程并选中,然后点击“确定”。选择完成后:


点击“Finish”,完成对工程的导入。导入之后,工程的结构:


2、配置NDK的编译选项

先在“Package Explorer”中选中工程。然后依次选择“Project”->“Properties”->“Builders”。


点击“New”,弹出如下的对话框:


选择“Program”,点击“OK”按钮。这里设置ndk-build的路径,及工作目录等。


此处选择ndk-build的路径,注意,在Windows上,路径应该为android-ndk-r8e\ndk-build.cmd,而不是android-ndk-r8e\ndk-build,否则在编译时则会报错,非有效的win32 应用程序:


另外,那个“Arguments”部分,可以供我们添加一些编译时ndk-build可以接受的一些参数。如果我们希望每次build都是Debuggable build,则我们可以在此处添加:

NDK_DEBUG=1
而如果系统每次编译都是Release build,则可以添加:

NDK_DEBUG=0

然后是“Build Options”,一定要选中“During auto builds”。


勾选最下面的“Specify working set of relevant resources”,然后选择“Specify Resources...”。


选择jni目录。设置完成后,退回到工程浏览界面。

3、选中project,然后选择“Project”->“Build Project”,可以执行对工程的编译。


为编译所做的配置基本上如上面那样。

Clean的集成

我们可以参照前面为编译所做的那个配置,而为project的clean也做一点配置。为Builders新建Program项的操作与前面一样。只是,对于这个Program所做的配置与前面稍稍有一点区别。

首先,所要执行的那个command还是那个command。只是此处的Arguments部分需要添加上“clean”。


另外一点需要修改的是,在“Build Options”这边的“Run the builder”下面,需要只勾选‘During a “Clean”’。


执行Project->Clean...,就可以看到类似于下面的这种输出:


看起来,每创建一个新的project,就会需要做一次这种繁琐的事情。其实不然,还有一种更为简便的一劳永逸的方法。通过这种方法,我们将只需对工程做很简单的一旦设置。方法如下。

ndk的集成

在Eclipse中,选择“Window”->"Preferences"进入首选项,然后打开"Android"项,选中“NDK”子项。设定NDK的location:

然后在“Package Explorer”中选中导入的工程,右键单击,会有一个上下文菜单弹出来,在弹出的上下文菜单当中选中“Android Tools”->“Add Native Support...”,如下图:


随后会有一个对话框弹出来,要求我们输入so的名称,我们只要输入jni下Android.mk里面所定义的那个“LOCAL_MODULE”的值即可:


然后点击“Finish”,结束对工程的设置。

之后,我们在“Build Project”和“Clean Project”时,就都会执行ndk-build了。

Application.mk

APP_ABI

默认情况下,NDK 编译系统会为“armeabi” ABI产生机器码。这对应于基于ARMv5TE的CPU,这种CPU含有浮点操作。我们可以通过在Application.mk文件中定义APP_ABI来指定一种ABI。比如,为了支持基于ARMv7的设备的硬件FPU指令集,我们可以使用:

APP_ABI := armeabi-v7a
或者为了支持IA-32指令集,使用:


APP_ABI := x86
或者为了支持MIPS指令集,使用:

APP_ABI := mips
或者同时支持所有种类的ABI,使用: 

APP_ABI := armeabi armeabi-v7a x86 mips
自NDK r7开始,我们也可以使用特殊的“all”值来表示,我们想要支持所有种类的ABI: 

APP_ABI := all
以我们前面的那个 hello-neon为例,指定APP_ABI := all,在编译时则可以看到如下的输出: 


APP_STL

Application.mk另一个非常有用的地方是指定我们要使用的C++ STL。默认情况下,NDK编译系统只为Android系统提供的最小的C++运行时库(/system/lib/libstdc++.so)提供了头文件。然而,NDK有一些可选的C++实现,以方便我们在我们的应用程序中使用。定义APP_STL可以让我们选择其中一个。比如:

APP_STL := stlport_static    --> static STLport library
       APP_STL := stlport_shared    --> shared STLport library
       APP_STL := system            --> default C++ runtime library
如果不在此处指定要用的STL,在code中有用到STL的话,build时就会failed。

ndk-gdb

我们可以在工程目录下执行ndk-gdb这个工具。这个工具实际上是对交叉编译的gdb做了一点点封装。它能够依据与libs/[ABI]/gdb.setup的内容,帮我们完成一些设置。可以看一下NDK的sample app hello-jni编译所产生的gdb.setup文件的内容:

启动之后,ndk-gdb的使用,就和普通的gdb的使用没有什么区别了,我们一样可以完成下断点等操作。


展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
打赏
1 评论
1 收藏
0
分享
返回顶部
顶部