首页 > 代码库 > 自己的第一个NDK的Demo

自己的第一个NDK的Demo

DEMO下载链接http://download.csdn.net/detail/logicsboy/7535409

首先给你们恶补下啥是NDK:(我从百度Copy的) 

NDK全称:Native Development Kit。
1、NDK是一系列工具的集合。
* NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。[1] 
* NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU、API等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
* NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
2、NDK提供了一份稳定、功能有限的API头文件声明。
Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、准数学库(libm)、压缩库(libz)、Log库(liblog)。

==========================================================
好了,接下来我们在了解了解啥时JNI  ? 
JNI是Java Native Interface的缩写,中文为JAVA本地调用。
从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

========================================================
好了概念大致就是上面那样,接下来我们要看看怎么构建自己的第一个NDK程序咯。
步骤啥的有图的看图,有文字的看文字吧。
1.先创建AndroiddProject,创建一个helloNDK.java:

MainActivity.java文件:


2.然后编译上述文件产生的 .class文件。因为eclipse保存之后,就会自动编译。保存之后,去找你的.class文件吧、

找到helloNDK.class文件的路径。
3.使用javah工具,产出C语言的*.h头文件,
   在项目工程建立一个jni的文件夹.
   
  打开Windows命令窗口,并进入jni目录区域,执行javah工具去读取上述的            helloNDK.class文件,从而生成*.h头文件,输入命令:

然后回车,注意目录别弄错了,然后会在jni目录下面生一个com_misoo_pk01_helloNDK.h的文件,当然你也可以设定生成的文档的名称。
命令如下:javah -o helloNDK.h -classpath ../bin/classes com.misoo.pk01.hellNDK
生成的com_misoo_pk01_helloNDK.h文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_misoo_pk01_helloNDK */

#ifndef _Included_com_misoo_pk01_helloNDK
#define _Included_com_misoo_pk01_helloNDK
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_misoo_pk01_helloNDK
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_misoo_pk01_helloNDK_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

最好不要自己手动去修改它吧,我也懒的去试,毕竟这是命令生成的。不关我们的事。

4.然后我们就可以把这个*.h的文件,交给C端开发者去,结合JNI语法,撰写xxx.c的代码,
我们现在的这个程序的xxx.c的代码如下(前提你的代码和我的一样)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "com_misoo_pk01_helloNDK.h"

JNIEXPORT jstring JNICALL
	Java_com_misoo_pk01_helloNDK_sayHello
		(JNIEnv *env, jobject thiz){

		return (*env)->NewStringUTF(env,"Hello,NDK....");
}

5. 我们需要在NDK包的安装目录下拷贝一个Android.mk的文件到jni目录,并且内容为:
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := helloNDK
LOCAL_SRC_FILES := com_misoo_pk01_helloNDK.c

include $(BUILD_SHARED_LIBRARY)

注意内容不能错了。

6.接下来我就需要将这个项目放到NDK的samples目录下面

7.然后使用cygwin工具编译生成.so文件


编译的关键命令在找到目录之后:../../ndk-build然后回车就行了。
最后生成的.so文件你就可以粘到libs目录下面了

最后拷贝到你的项目中,开始run吧、

大功告成咯。