第一步,要创建一个Android工程。这一步就不用多说了。我的工程创建完的目录如下图:
第二步,写java文件MainActivity.java 和布局文件activity_main.xml
activity_main.xml内容如下:
MainActivity.java的内容如下:
package com.dfe.hellondk;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView tv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)this.findViewById(R.id.show_tv);
tv.setText( strFromJNI() );
}
/*
*声明本地方法,这个 方法已经被打包进本应用的本地库'jni_hello'实现
**/
public native String strFromJNI();
/*
* 在程序启动时加载jni_hello库。这个库在应用安装时被package manager 解压到 /data/data/com.dfe.hellondk/lib/libjni_hello.so
*/
static{
System.loadLibrary("hello_ndk");
}
}
到这里java部分就算完成了。
(1)生成头文件
首先在你的工程目录下新建一个jni文件夹。如下图
然后在windows下打开dos窗口,开始 --> 输入cmd并按回车键。进入ndk目录,不知dos命令的可自行网上搜索。使用dos命令进入工程目录。在使用javah生成头文件之前,确保你的jdk安装并配置环境变量没有问题。然后使用使用命令:
javah -classpath src -d jni com.dfe.hellondk.MainActivity
如下图:
对命令简单说一下:
javah :命令名称
-classpath src :指定包含要操作的类的文件夹名,比如我需要操作的类是MainActivity,而包含这个类的包在src目录下。
-d jni :指定生成的头文件保存的目录。
com.dfe.hellondk.MainActivity :要操作的类
如果没有什么问题,头文件应该已经生成了,我的头文件文件名是 com_dfe_hellondk_MainActivity.h 头文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_dfe_hellondk_MainActivity */
#ifndef _Included_com_dfe_hellondk_MainActivity
#define _Included_com_dfe_hellondk_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_dfe_hellondk_MainActivity
* Method: strFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_dfe_hellondk_MainActivity_strFromJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
(2)编写相应的C文件
C文件主要是实现头文件中的函数。在jni目录下新建hello_ndk.c ,文件名可以随意,最好见名知意其内容如下:
#include
#include
jstring Java_com_dfe_hellondk_MainActivity_strFromJNI (JNIEnv* env, jobject thiz)
{
return (*env)->NewStringUTF(env, "Hello , Ndk !");
}
Android.mk主要是定义编译规则,和Linux下makefile类似。在jni目录下新建Android.mk文件,其内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#c源文件的名字,不包含后缀
LOCAL_MODULE := hello_ndk
#c源文件的名字
LOCAL_SRC_FILES := hello_ndk.c
include $(BUILD_SHARED_LIBRARY)
文件已经全部写好了,下面就是要进行编译了。
我们再看一下先在的工程目录:
工程下多了一个jni目录,jni含有我们刚刚编写的三个文件。
再工程目录中,右键点击工程名 --> Android tools --> Add Native Support 来添加ndk支持,会出现如下界面:
点击finish按钮。
然后点击工具栏中的锤子图标进行编译,如下图:
有可能会出现错误:Method 'NewStringUTF' could not be resolved
解决办法,看我另一个博客:http://blog.csdn.net/dingfengen/article/details/51604710
如果问题解决再次编译会出现如下图:
然后就是下载到手机测试,结果如下:
这样第一个ndk程序就ok了。
这里参考了:
http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html
非常感谢。