二、Android NDK开发---从Hello Word学起

NDK目录简单介绍  

        在进行NDK开发之前,我们有必须熟悉一下NDK目录下包含哪些东西,以及这些东西对开发来说有什么作用?那么现在打开NDK的解压目录,查看一下解压目录下的文件:
技术分享

1)samples目录。这个目录包含了Google为NDK开发撰写的一些小例子,包括本地JNI开发,图片处理,多个库文件开发等等,这些例子虽小但面面俱到,能看懂samples目录下的小例子程序,那么对于NDK开发来说,就很好应付了。

2)docs目录。这个目录下存放的都是Google给开发者提供的文档,指导开发者怎样在Android环境下进行NDK开发,这个非常重要。

3)sources目录。由于Android是开源操作系统,作为Android的一部分的NDK,同样也是开源的,这个目录下存放的是NDK源码。

4)platforms目录。里面存放的是当前ndk版本所支持的所有android平台的版本,做NDK开发的C代码也是可以指定由某个特定版本平台下编译,该platforms目录下存放的是不同版本所包含的C的库文件和头文件,不同版本有些微小的变化。

5)prebuilt目录。这是提供给在Windows下开发ndk程序的一些工具集。

6)build目录。里面存放大量的Linux编程脚本和Windows下的批处理文件,用来完成ndk开发中的交叉编译。 

具体开发

1,NDK开发步骤

        首先,我先列出NDK开发的简单步骤,然后再以此为大纲,用一个Hello World的实例讲述一下NDK开发:

(1)创建一个android工程

(2)JAVA代码中写声明native 方法 public native String helloFromJNI();

(3)创建jni目录,编写c代码,方法名字要对应在c代码中导入jni.h头文件

(4)编写Android.mk文件

(5)Ndk编译生成动态库

(6)Java代码load 动态库.调用native代码

2,NDK开发具体实践

     下面就按照上述的步骤建立一个HelloWorld小案例来一步一步实现NDK开发

1,创建一个Android工程,并且在Java代码中声明一个native方法:
package com.example.ndkdemo01;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
    static{
        System.loadLibrary("Hello");  //System.loadLibrary(String 文件名);是用来加载动态库的方法,其中参数类型是字符串,参数是Android.mk文件中LOCAL_MODULE定义的名称。
    }
private Button bt_click;
public native String javaFromJNI();    //声明native方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_click = (Button) this.findViewById(R.id.bt_click);
        bt_click.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 Toast.makeText(MainActivity.this, javaFromJNI(),  
                            Toast.LENGTH_SHORT).show();  
            }
        });
    }

}

 

2,创建jni目录,编写Hello.c文件。
   先来说一下JNI代码的简单格式:方法签名规则:返回值类型 Java_包名_类名_native方法名(JNIEnv* env, jobject obj)
 1) Java: 表示被Java调用。  包名:表示package的名称(com_example_ndkdemo01),其中的"."被下划线替代。      MainActivity:申明调用函数的类名。     javaFromJNI:申明的函数名。
 2)怪异的返回值,在NDK中,不管是从Java传过来的传递值,还是传回Java的返回值,都是专门的参数(比如java中的string对应ndk的jstring,int[]对应jintarray,具体可参见jni.h)。

 3)多出来的传递参数,JNIEnv* env和jobject thiz是底层函数,必须要带的参数。env开发者利用此参数做查询和传化数据类型(比如将jintarray转换成int数组,在以后的章节中会详细说明)。thiz表示这个调用这个函数的类对象,本文中就是MainActivity的对象。

#include<stdio.h>
#include<jni.h>


jstring Java_com_example_ndkdemo01_MainActivity_javaFromJNI(JNIEnv* env, jobject obj) {


    return (*(*env)).NewStringUTF(env, "hello jni!");

}
3,编写Android.mk文件

这个Android.mk文件怎么写呢?这时候我们得打开NDK的文档来看看了,位置E:/NDK/android-ndk-r10d/docs/Start_Here.html,找到

技术分享

好,我们就先在jni目录下创建一个Android.mk的文件,将上面的这段话复制粘贴进去,将LOCAL_MODULE和LOCAL_SRC_FILES修改成我们自己的名称:

 

 LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE    := Hello
    LOCAL_SRC_FILES := Hello.c
 
    include $(BUILD_SHARED_LIBRARY)

 


4,ndk编译生成动态库

在eclipse中点击项目,右击->>Android Tools->>Add Native Support... 。随后会有一个对话框弹出,在输入框里输入模块名称。可以看到编译通过了,下面刷新一下工程,就可以看到工程libs目录下多了个libHello.so的文件,这个就是Android认识的动态库了。

技术分享

 

 

5,Java代码load 动态库.调用native代码

编译出来这个libHello.so文件后,就需要在Java代码中加载这个.so的库文件了,代码很简单,然后Toast一下看看效果:

System.loadLibrary(String 文件名);是用来加载动态库的方法,其中参数类型是字符串,参数是Android.mk文件中LOCAL_MODULE定义的名称。

    转载自:http://blog.csdn.net/allen315410/article/details/41805719 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。