一.环境准备:
1.Cygwin:对于网速较慢的孩子,可以直接下载一个简约版: http://www.wishdown.com/soft/52987.html
2.安装完毕后(笔者安装路劲为:E:\Android\Cygwin\setup)
1) 修改 E:\Android\Cygwin\setup\etc\defaults\etc\skel \.bash_profile
增加2行:
NDK=/cygdrive/E/Android/NDK/android-ndk-r9d
export NDK
2)同时也要修改 E:\Android\Cygwin\setup\home\lenovo\.bash_profile,增加 第一步的2行
注意:如果没有Home目录::进入环境变量设置,删除用户环境变量home,重新 运行即可产生
3.android-ndk
二.
1.新建一个Android工程HelloWorld,包名为com.apxar.hello
2.工程中:新建一个类HelloAndroidNDK
代码如下,保存
package com.apxar.hello;
public class HelloAndroidNDK {
//静态代码块,在加载类的时候会执行
static
{
System.loadLibrary("HelloMyNDK");
}
//声明加载C库的本地方法
native String sayHello();
}
3.Android工程OnCreate函数中添加:
HelloAndroidNDK ndk=new HelloAndroidNDK();
Toast.makeText(this, ndk.sayHello(), Toast.LENGTH_LONG).show();
3.生成 头文件
1)在工程根目录新建一个jni的目录
2)命令行下:cd 进入jni目录
3)使用javah -classpath D:\android\workspace\HelloWorld\bin com.apxar.hello.HelloAndroidNDK //D:\android\workspace\HelloWorld\bin为class的根目录,后面参数 class的名字,
4)此时在jni目录中将生成com_apxar_hello_HelloAndroidNDK.h头文件
4.编写C语言程序,实现.h头文件:com_apxar_hello_HelloAndroidNDK.c
#include "com_apxar_hello_HelloAndroidNDK.h"
JNIEXPORT jstring JNICALL Java_com_apxar_hello_HelloAndroidNDK_sayHello //这个函数的定义在头文件中已经定义好
(JNIEnv *env, jobject obj)
{
return (*env)->NewStringUTF(env,"Hello Apxar");
}
5.编写Android.mk
1).从ndk中复制出一份样版(本人的目录为E:\Android\NDK\android-ndk-r9d\samples\hello-jni\jni中复制Android.mk)
2).复制到Android工程的jni目录中
3).修改Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloMyNDK //名称要与: System.loadLibrary("HelloMyNDK")中的一样
LOCAL_SRC_FILES := com_apxar_hello_HelloAndroidNDK.c //我们的C语言文件
include $(BUILD_SHARED_LIBRARY)
6.编译链接c程序:
1).在Android-ndk的Samples目录下,新建一个文件夹MyNdkProject 用于存在工程
2).复制Android工程到MyNdkProject 目录下
3).打开Cygwin Bash Shell:
命令:
1)cd $NDK //进入NDK目录
2)cd samples\MyNdkProject
3)ndk-build
7.Eclcipse重新导入MyNdkProject 中的工程HelloWorld, 工程中多出了libs/armeabi/LibHelloMyNDK.so文件
8.运行
总流程: 创建Android工程-> 创建包含nativ本地方法的java类 -> javah工具 class生成.h到jni目录 -> 编写.c- > 修改Android.mk -> 编译链接ndk-build ->android调用该类的方法