第一个NDK工程--hello ndk

第一步,要创建一个Android工程。这一步就不用多说了。我的工程创建完的目录如下图:

第一个NDK工程--hello ndk_第1张图片


第二步,写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部分就算完成了。


第三步,编写相应的C/C++代码。

(1)生成头文件

首先在你的工程目录下新建一个jni文件夹。如下图

第一个NDK工程--hello ndk_第2张图片


然后在windows下打开dos窗口,开始 --> 输入cmd并按回车键。进入ndk目录,不知dos命令的可自行网上搜索。使用dos命令进入工程目录。在使用javah生成头文件之前,确保你的jdk安装并配置环境变量没有问题。然后使用使用命令:

javah -classpath src -d jni com.dfe.hellondk.MainActivity

如下图:

第一个NDK工程--hello ndk_第3张图片


命令简单说一下:

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

这里说一点,函数  Java_com_dfe_hellondk_MainActivity_strFromJNI    对应于MainActivity中的strFromJNI方法。其名称虽然很长,但是有规则的,这个规则按照 java_pacakege_class_mathod,即是 java_包名_类名_方法名。

(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 !");
}

(3)编写Android.mk

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)

第四步,编译。

文件已经全部写好了,下面就是要进行编译了。

我们再看一下先在的工程目录:

第一个NDK工程--hello ndk_第4张图片


工程下多了一个jni目录,jni含有我们刚刚编写的三个文件。

再工程目录中,右键点击工程名 --> Android tools --> Add Native Support  来添加ndk支持,会出现如下界面:

第一个NDK工程--hello ndk_第5张图片


点击finish按钮。

然后点击工具栏中的锤子图标进行编译,如下图:

有可能会出现错误:Method 'NewStringUTF' could not be resolved 

解决办法,看我另一个博客:http://blog.csdn.net/dingfengen/article/details/51604710

如果问题解决再次编译会出现如下图:

第一个NDK工程--hello ndk_第6张图片


然后就是下载到手机测试,结果如下:

第一个NDK工程--hello ndk_第7张图片


这样第一个ndk程序就ok了。


这里参考了:

http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html

非常感谢。




你可能感兴趣的:(android)