前期下载,配置ndk环境在此忽略,之前有写过。
1:创建一个android 工程:
比如叫项目名叫testNDK,程序名:testNDK,包名:com.cheng,activity:testNDK
2:在包下创建一个java类,名字叫“JNI”,内容如下:
package com.cheng; public class jni { public native int GetCint(); public native String getCstring(); }
3将目录“../src/com/cheng”下的JNI.java文件,复制到“../bin”目录下(经个人测试,此步不需要了)
4打开终端,目录定位到"../bin",执行“javac JNI.java”,会生成JNI.class(此时终端不要关闭,还要用呢)(经个人测试,此步不需要了)
5将JNI.class 复制到“../bin/com/cheng”目录下,覆盖同名文件(经个人测试,此步不需要了)
6继续在终端输入 “javah -jni com.cheng.Jni”,此时会在当前目录下生成一个头文件“com_cheng_Jni.h”
7在代码根目录下创建一个文件夹,名字为“jni”,将“com_cheng_Jni.h”复制到此文件夹里
8创建c文件:
a这里可以创建一个c工程,也可以直接创建*.c文件。
我是创建了一个c工程,工程名任意(helloNDK),目录要制定到“../jni”这里
b创建c文件,因为头文件是“com_cheng_Jni.h”,所以c文件名对应的必须是“com_cheng_Jni.c”
内容:
#include <stdio.h> #include <stdlib.h> #include "com_cheng_jni.h" int add2() { int x=10,y=10; return x+y; } JNIEXPORT jint JNICALL Java_com_cheng_jni_GetCint (JNIEnv *env, jobject thiz) { return add2(); } JNIEXPORT jstring JNICALL Java_com_cheng_jni_getCstring (JNIEnv *env, jobject thiz) { (*env)->NewStringUTF(env,"hello cheng!!!"); }代码书写,头文件必须要手输上去,add2方法自己随便写一个就是了。
后面两个方法,直接到“com_cheng_Jni.h”中,把两个函数声明复制过来,补上参数“env”,“thiz”
完成方法内容。
9在jni目录下创建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := helloNDK
LOCAL_SRC_FILES :=com_cheng_jni.c
include $(BUILD_SHARED_LIBRARY)
10,创建application.mk文件(这一步似乎不需要了,作者提供的编译命令似乎因版本升级过时了;后面执行的编译命令是我自己研究的,结果是对的)
11编译生成*.so文件:
终端,定位在代码根目录,执行ndk_build(关于这个命令的选项ndk-build -h查看)
12 此时在eclipse里右键项目,刷新项目文件,可以看到当前项目目录及文件结构,libhello-jni.so在obj目录下
13编辑testNDK.java,调用这个so文件
package com.cheng; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class TestNDKActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); JNI j=new JNI(); TextView t=new TextView(this); t.setText(j.getCstring()+Integer.toString(j.GetCint())); setContentView(t); } static { System.loadLibrary("helloNDK"); } }
14编译执行,在模拟器上能看到效果了。
---------------------------------------------------------------------------
注意:模块,文件名字母大小写,容易出错哦。
aNDK大概就是这个过程,做一遍,自己体会一下
b之后修改c文件,需要执行ndk-build -B,重新编译一下so文件,然后eclipse刷新一下文件目录,执行就可以看到变化了。
这里有一篇类似的文章,也可以参考一下:http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html