现在的位置: 首页 > 综合 > 正文

android 应用开发揭秘,ndk使用过程总结

2013年09月20日 ⁄ 综合 ⁄ 共 2151字 ⁄ 字号 评论关闭

前期下载,配置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














































【上篇】
【下篇】

抱歉!评论已关闭.