首页 > 代码库 > 15、NDK开发初步

15、NDK开发初步

一、什么是NDK?

NDK是Android让你潜入原生组件(C/C++开发)的一套开发套件

Android应用程序是运行在Dalvik虚拟机中的 ,NDK允许你通过原生代码实现部分的应用程序模块 。

二、为何要用NDK?

我们猜想一下:

1,需要重用你以前C/C++写好的模块

2,速度的需要

3,个别功能实现的需要,比如你要用到原生类库才能实现的一些功能

好处和坏处:

使用本地代码不一定能提高性能, 但是一定会增加程序的复杂性.

NDK适合用来做的事情一般是自包含的, CPU密集型的不需要大量内存的操作 -- 例如信号处理, 物理模拟等等. 

简单的将一个方法使用C重写一般不会达到性能的提升. 不过, NDK可以是一种重用大量已有C/C++代码的不错的方法.

三、Java JNI应用详解

3.1>分析总结JNI步骤

(1) 编写Java类,并定义native方法

(2) 使用Javah生成.h文件

(3) 建立C/C++动态链接库工程,并实现.h文件的接口

(4) 生成.so/dll文件并放到适当位置

(5) 启动Java程序

3.2>怎么理解JNI

JNI即是Java Native Interface, 通过JNI代码实现Java与Native代码的连接。

四、NDK应用实例

4.1>运行和发布模式是什么样的?

C/C++的原生代码任然是运行在虚拟机的;

.so文件是打包在apk文件里面的;

4.2>NDK特性

【稳定的API】

NDK提供了一组稳定本地API的系统头文件,

这些头文件被保证在以后发布的平台中被支持:

libc (C 库) 头文件

libm (数学库) 头文件

JNI 接口头文件

libz (Zlib 压缩) 头文件

liblog (Android 日志) 头文件

OpenGL ES 1.1 (3D 图形库)

头文件

一组最小的支持C++的头文件

 

【提供了生成原生代码类库的工具】

NDK提供了一个构建系统来使你能够有效的编译你的源代码,

而不需要处理工具链/平台/CPU/ABI的细节.

你只需创建一些简短的文件来描述你希望编译的文件,

以及android应用程序需要用到的文件

--

构建系统将编译这些源文件并将这些共享库放在你的应用程序工程中.

 

【提供了原生类库与Android App继承的一条途径】

【NDK与JNI的关系】

4.3>Case: 编写纯Native的代码

【配置编译环境】

"F:\Tools\Programming\SDK\android-ndk-r7b\" 是NDK的安装目录

 

[Cross Settings]

Prefex: arm-linux-androideabi-

Path: F:\Tools\Programming\SDK\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows

 

[Cross GCC Compiler]

Include Paths:

F:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\include\

F:\Tools\Programming\SDK\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\include\

F:\Tools\Programming\SDK\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.4.3\include

F:\Tools\Programming\SDK\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.4.3\include-fixed\

F:\Tools\Programming\SDK\android-ndk-r7b\sources\cxx-stl\stlport\stlport\

 

Miscellaneous:

Other Flags :-c -fmessage-length=0 -DANDROID -fno-exceptions

(如果使用stlport,“-DANDROID -fno-exceptions” 选项是必须的否则 stlport中的 #include_next 没法使用)

 

[Cross G++ Compiler] 同上

 

[Cross G++ Linker]

General: -nostdlib

Libraries:

c

m

stdc++

stlport (若要需添加,需从设备上取得/system/lib/libstlport.so文件并放到lib包含目录)

库路径:

F:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\lib

Miscellaneous:

其它选项:

-RF:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\lib

其它对象:

F:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\lib\crtbegin_dynamic.o

F:\Tools\Programming\SDK\android-ndk-r7b\platforms\android-9\arch-arm\usr\lib\crtend_android.o

 

【发布程序】

 

【建立调试环境】

使用GDB调试 ,在Eclipse中调试。

4.4>Case: NDK的Helloworld

建立工程;

编译.so文件;

运行工程文件;

调试Native代码;

(1)为Android工程添加Native支持.

(2)配置调试环境。

 

 

15、NDK开发初步