Android NDK

Android NDK 是运行于Android 平台上的Native Development Kit 的缩写。 NDK 编译需要用到Cygwin 中的make 和gcc,

The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++. For certain types of apps, this can be helpful so that you may reuse existing code libraries written in these languages and possibly increased performance.

Here OpenCV is a collection of C functions and a few C++ classes that implement many popular Image Processing and Computer Vision algorithm. Android 应用开发者可以通过NDK 调用C 或C++ 本地代码。

Typical good candidates for the NDK are self-contained, CPU-intensive operations that don’t allocate much memory, such as signal processing, physics simulation, and so on. When examining whether or not you should develop in native code, think about your requirements and see if the Android framework APIs provide the functionality that you need.

Window下使用android NDK开发Android应用-入门篇

最新版本的NDK都是用过一个ndk-build的命令进行编译,通过一个*.mk的文件为编译的makfile文件,进入cygwin开发环境后,进入你们要编译项目的根目录执行ndk-build就可以编译了,它可以自动找到项目子目录中的*.mk文件,很方便。

R7之前的版本,必须要安装Cygwin才能使用NDK。从R7开始,Windows版本的NDK提供了一个ndk-build.cmd脚本,可以直接利用这个脚本编译。想要做到这一点,只要为Eclipse Android工程添加一个Builder,就能实现Eclipse的自动编译NDK。

 新建并配置一个Builder

点击Project->Properties->Builders->New,新建立一个Builder。在弹出的对话框上面点击Program,OK!

在弹出的对话框【Edit Configuration】中,配置选项卡【Main】:

  • Location中需要填入nkd-build.cmd的路径(NDK安装目录下)。
  • Working Diretcoty中需要填入TestNDK的工程根目录:

配置选项卡【Refresh】:

  • 勾选“Refresh resources upon completion”,
  • 勾选“The entire workspace”,
  • 勾选“Recuresively include sub-folders”。

配置选项卡【Build Options】:

  • 勾选“After a “Clean””,
  • 勾选“During manual builds”,
  • 勾选“During auto builds”,
  • 勾选“Specify working set of relevant resources”。

点击“Specify Resources…”勾选TestNDK工程的“jni“目录 ,Finish!保存设置,OK!当在console里面看到如下图所示的信息,则表示一切正常,此时就已经是自动编译代码了。

使用 NDK 进行编译

在工程 jni 目 录 下 执 行 ndk-build

$ cd ~/workspace/study.opencv/jni
$ ~/android-ndk-r6/ndk-build.

如果编译成功,则会在工程下面生成 libs/armeabi/facedetect.so 动态库(.so);如有编译失败,请根据提示修改错误。Run “$NDK/ndk-build” from your project directory. It will generate libopencv.so in the libs/armeabi folder.

Using Eclipse to Compile NDK Applications

After we perform the integration, each time a C/C++ source file in the project changes, Eclipse will perform compilation and linking on our behalf.

Android NDK的目标

Android虚拟机允许你的应用程序源代码通过JNI调用实现本地代码的方法:

  • 应用程序源代码将用‘native’关键字声明一个或多个方法来表明这些方法是通过本地代码来实现的。例如:
    native byte[]  loadFile(String  filePath);
  • 必须提供一个包含这些方法实现的本地共享库,该共享库将会打包到你的应用程序的.apk文件中。
    这个共享库需要根据标准的Unix的公约来命名,像lib<something>.so,并且应包含标准JNI切入点,例如:
    libFileLoader.so
  • 应用程序应必须明确地加载这个库。例如,在应用程序的开始加载它,只需将以下内容添加到应用程序的源代码中:
    static {
    System.loadLibrary(“FileLoader”);
    } //注意,在这里,不需要使用’lib’前缀和’.so’后缀。

Android NDK是对Android SDK的补充,帮助你:

  1. 生成JNI兼容共享库,这些库可以运行在ARM处理器上的Android1.5平台(及更高版本)。
  2. 拷贝生成共享库到应用程序工程路径的正确位置,那么它们将被自动添加到你的最后(和已签名)的.apk文件中。
  3. 在以后的NDK修订中,我们打算提供工具通过一个远程的gdb连接来帮助调试你的本地代码以及更多的源/符号信息。
  4. 一套交叉工具链(编译器,连接器等),可以产生本地的ARM二进制文件在Linux,OS X和Windows操作系统运用(使用Cygwin )
  5. 一套系统头符合于Android平台支持的稳定本地API列表。这相当于定义都保证支持所有更高版本的平台。
  6. 一个编译系统,它允许开发者编写很短的编译文件来描述哪些代码是需要编译的,并且怎样编译。该编译系统处理所有的多如毛发的工具/平台/处理器/ABI的细节。

NOTE:

  • NDK不是用来编写通用的运行在Android设备上的本地代码。特别指出,你的应用程序仍然应该用JAVA语言来编写,处理Android系统事件,应避免弹出”应用程序没有响应”对话框或处理Android应用。
  • NDK仅提供系统头,它针对Android平台支持的一套非常受限制本地APIs和库。虽然一个典型Android系统映像包含许多本地共享库,这些共享库应该考虑执行的细节,这些细节可能在已经发布的平台和更新之间被彻底改变。

NDK开发实践

  1. 运行build/host-setup.sh配置NDK
  2. 放置你的代码到目录 sources/<mysrc>
  3. 编写sources/<mysrc>/Android.mk文件描述你的代码给NDK编译系统: Android.mk文件是一个小编译脚本,NDK组织源文件进入”modules”,这里每个模块可以是下列之一:一个静态库,一个共享库,可以定义几个模块在一个单独的Android.mk文件中;或编写几个Android.mk文件,每个文件定义一个单独的模块。全部Android.mk文件在其他编译发生前被编译系统解析。一个单独的Android.mk可以被编译系统解析多次。默认情况下, NDK将寻找匹配下列的所有文件:$NDK/sources/*/Android.mk    如果你想要定义Android.mk到子目录,你应明确地在顶级Android.mk文件中包含它们:include $(call all-subdir-makefiles),将包含全部在当前编译文件路径下子目录中的全部Android.mk文件。
  4. 编写apps/<myapp>/Application.mk文件描述你需要NDK编译系统编译的应用程序和本地代码. Application.mk文件描述应用程序以及应用程序需要的模块。该文件必须位于: $NDK/apps/<myapp>/Application.mk, 该文件用于提供给NDK编译一下内容: – Android应用程序工程路径的位置;- 应用程序需要的NDK模块的列表; – 可选信息,如判断你要发布或者是调整编译,指定C或C++编译标志等;  – 计划:具体平台/处理器的清单,你想要的明确目标(当前仅支持一个)。可以定义几个Application.mk文件建立同一个应用程序的不同编译,例如:
    $NDK/apps/release/Application.mk
    $NDK/apps/debug/Application.mk
  5. 在NDK顶级目录中运行”make app=<myapp>”编译你的本地代码(在cygwin中),进入NDK顶级目录,然后使用以下命令调用编译系统: make APP=<myapp>
  6. 如果编译成功,最后一步将拷贝共享库到你的应用程序工程根目录。然后你就可以通过正常手段生成最后的.apk文件。

c 文件中,函数名这样定义:
Java_testNDK_android_HelloJni_stringFromJNI ,是因为这个是 JNI 的标准,定义需要按照如下格式:

Java_packagename_classname_methodname,

例如:

Java_testNDK_android_HelloJni_stringFromJNI
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

生活在西班牙

自己动手丰衣足食

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

%d bloggers like this: