一直想研究一下NDK的东西,却总是因为项目中用不上而作罢,今天闲下来,HELLO WORLD了一把。

 

依例,做任何一件事情之前都先GOOGLE,果然,有不少关于NDK的文章,所以,做这个HELLOWORLD还是很简单的,只是大家要注意因为NDK R4有一些改动,切不可拿以前的文章来依葫芦画瓢。

 

 

安装步骤:
1. 下载,这个就不多说了,下载 android-ndk-r4b-linux-x86.zip 或者 android-ndk-r4b-windows.zip。
注:我是在Ubuntu 10.4 32bit 桌面版上做的实验,如果你用windows,则必须使用cygwin,网上有文档可参考。 
2.解压缩即是安装。一如既往的简单。我放在 /usr/android-ndk-r4b 下面了。
 
 
写个HELLO WORLD
1.用Eclipse IDE生成一个缺省的最简单的工程,就是那个只有一个TextView的Hello world. 注意包名,比如我的 cn.sharetop.android.hello.ndk,类名HelloNDKActivity。
2.去修改一下res/layout/main.xml,为那个没有ID的TextView增加一个ID,比如 android:id="@+id/label" ,然后再修改这个HelloNDKActivity,如下:
 
public native String sayHello(String name);
...
static {     
 System.loadLibrary("hello_jni");
}
 
@Override
public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  
  TextView label=(TextView)findViewById(R.id.label);
  label.setText(sayHello("中国"));
  
}

    
3.进入工程所在目录,比如我的 /home/yancheng/myworkspace/hello ,建立一个子目录 sudo mkdir jni。
 
4.进入jni目录,新建三个文件(直接在eclipse里新建即可),一是Android.mk 二是 hello_a.c,三是hello_a.h
 
5.在eclipse中编译运行一下那个Activity,然后去 bin 目录下面,弄出JNI的头文件,命令:javah cn.sharetop.android.hello.ndk.HelloNDKActivity ,它会处理 这个类中定义的native方面,得到一个文件cn_sharetop_android_hello_ndk_HelloNDKActivity.h。
 
6.打开这个头文件,把里面的内容拷到hello_a.h中即可。这个东西自动生成的,就不多说了。
 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <string.h>
/* Header for class cn_sharetop_android_hello_ndk_HelloNDKActivity */

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

/*
 * Class:     cn_sharetop_android_hello_ndk_HelloNDKActivity
 * Method:    plus
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_cn_sharetop_android_hello_ndk_HelloNDKActivity_plus
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif


 
7.现在编辑hello_a.c,写实现代码,很简单:
 
#include "hello_a.h"

//所有JNI的函数都有这个JNIEnv 和 jobject ,可以用它做很多事情(具体参考 jni.h)
jstring JNICALL Java_cn_sharetop_android_hello_ndk_HelloNDKActivity_sayHello(JNIEnv * env, jobject thiz, jstring name){
 
 //取参数转成我们熟悉的char*
 const char* param=(*env)->GetStringUTFChars(env,name,0);
 //这儿好熟悉啊
 char * str=(char*)malloc(32*sizeof(char));
 strcpy(str,"hello ");
 strcat(str,param);
 
 //释放掉param
 (*env)->ReleaseStringUTFChars(env,name,param);
    //返回结果
   jstring ret= (*env)->NewStringUTF(env,str);
 
 free(str);
 return ret;
}


 
8.可以编辑那个Android.mk了,也相当简单,因为我们只是一个Hello world,想复杂也不知如何复杂:
 
#设置工作目录为当前目录
LOCAL_PATH := $(call my-dir)

#执行清空一下各个参数
include $(CLEAR_VARS)

#设置编译出的模块名称
LOCAL_MODULE := hello_jni

#设置源文件列表
LOCAL_SRC_FILES :=hello_a.c

#执行生成共享库
include $(BUILD_SHARED_LIBRARY)


 
9.好了,还是在terminal下面,进入jni目录下,执行编译: /usr/android-ndk-r4b/ndk-build ,输出如下:
 
Compile thumb  : hello_jni <= /home/yancheng/workspace/HelloNDK/jni/hello_a.c
SharedLibrary  : libhello_jni.so
Install        : libhello_jni.so => /home/yancheng/workspace/HelloNDK/libs/armeabi

10.回到eclipse,refresh一下,然后build,run,在手机上就可以看到了结果了。