Android NDK安装及使用简介

Android NDK安装及使用简介

什么是Android NDK

Android 应用程序是运行在Dalvik虚拟机之上的。NDK可以让你用本地代码例如C/C++来实现应用程序的一部分。这样可以为应用程序的某些类在复用已有代码或提高性能方面提供便利。

如果你的代码是用C/C++来实现的,你的应用程序仍然会被打包成.apk文件,并且仍然运行在虚拟机上。Android应用程序的模型是不变的。

NDK的下载及安装

NDK的官方下载地址为:

http://developer.android.com/sdk/ndk/index.html

下载完成后进行解压,就可以直接使用目录中的ndk-build了。为了使用方便,可以用如下命令将ndk-build放入默认路径中:

[plain] view plain copy
  1. export PATH=$PATH:<你解压好的目录地址>  

NDK的使用方法

目前为止,用C/C++编写Android应用程序有两种方式:

1. 用C/C++编写主要的逻辑层,再用java编写界面层并调用C/C++的库;

2. 用C/C++直接开发完整的应用程序,完全不用java。(仅Android 2.3之后的版本支持)

第一种方法较为通用,因为用java开发Android应用程序的界面比较简单;第二种方法较为复杂并且很少用到。在此我们只介绍第一种使用方法的步骤,第二种使用方法可以在第一种方法的基础上,参照NDK目录中自带的例子程序samples/native-activity。

我们以一个简单的例子,一步步带领大家写出一个简单的hello-jni程序。

第一步 建立一个Android工程

如果你使用eclipse进行开发,很简单,在此就不赘述了。不过为了与下文的名称保持一致,请把项目名设为hello-jni,包名为com.example.hellojni,类名为HelloJni。

如果你使用shell进行开发,执行如下三行命令即可:

[plain] view plain copy
  1. mkdir hello-jni  
  2. cd hello-jni  
  3. android create project -p . -t android-8 -k com.example.hellojni -a HelloJni  

第二步 编写C源文件及Makefile

在项目目录下新建一个jni目录,然后在jni目录下建立两个文件:

第一个:main.c文件,内容如下:

  1. #include <string.h>  
  2. #include <jni.h>  
  3.   
  4. /* This is a trivial JNI example where we use a native method 
  5.  * to return a new VM String. See the corresponding Java source 
  6.  * file located at: 
  7.  * 
  8.  *   hello-jni/src/com/example/HelloJni/HelloJni.java 
  9.  */  
  10. jstring  
  11. Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,  
  12.                                                   jobject thiz )  
  13. {  
  14.     return (*env)->NewStringUTF(env, "Hello from JNI !");  
  15. }  
第二个:Android.mk文件,内容如下:
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE    := hello-jni  
  6. LOCAL_SRC_FILES := hello-jni.c  
  7.   
  8. include $(BUILD_SHARED_LIBRARY)  

第三步 编译C源码生成so文件

直接在hello-jni目录下执行ndk-build。如果编译成功,可以看到生成了libs/armeabi/libhello-jni.so文件,该文件就是我们得到的C库了。

第四步 在java源码中调用C库中的函数

在hello-jni下打开src/com/example/jni/HelloJni.java文件,可以看到Android SDK已经帮我们自动生成了一些代码:

  1. package com.example.jni;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class HelloJni extends Activity  
  7. {  
  8.     /** Called when the activity is first created. */  
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState)  
  11.     {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.     }  
  15. }  
为了调用我们用C写好的函数,需要对其进行简单修改,修改后内容如下:
  1. package com.example.hellojni;  
  2.   
  3. import android.app.Activity;  
  4. import android.widget.TextView;  
  5. import android.os.Bundle;  
  6.   
  7.   
  8. public class HelloJni extends Activity  
  9. {  
  10.     /** Called when the activity is first created. */  
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState)  
  13.     {  
  14.         super.onCreate(savedInstanceState);  
  15.   
  16.         TextView  tv = new TextView(this);  
  17.         tv.setText( stringFromJNI() );  
  18.         setContentView(tv);  
  19.     }  
  20.   
  21.     public native String  stringFromJNI();  
  22.   
  23.     static {  
  24.         System.loadLibrary("hello-jni");  
  25.     }  
  26. }  
  27.                                                 
对比两个文件可以看到需要修改的几个地方:

1. 引入了一个 TextView

  1. TextView  tv = new TextView(this);  
2. 在末尾,我们在static域内调用了:
  1. System.loadLibrary("hello-jni");  
这个调用的目的就是引入刚刚编译好的那个C库,这个C库的名字就叫hello-jni,这个名字是我们在Android.mk文件中指定的:
  1. LOCAL_MODULE    := hello-jni  
这两处的名称需要保持一致。

3. 我们声明了一个函数

  1. public native String  stringFromJNI();  
并在TextView中调用了它,将其返回结果显示出来
  1. tv.setText( stringFromJNI() );  
这个函数定义的地方,就是我们在刚刚C文件中写道的
  1. jstring  
  2. Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,  
  3.                                                   jobject thiz )  
  4. {  
  5.     return (*env)->NewStringUTF(env, "Hello from JNI !");  
  6. }  
有人会问这两个函数的名称为什么不一样,有什么对应关系。没错,是不同。对应关系是

C中定义的名称为:Java_包名_类名_函数名

java中调用的名称为:函数名

第四步 编译生成apk文件

如果你使用eclipse进行开发,点击编译运行就可以了。

如果你使用shell进行开发,输入命令:

[plain] view plain copy
  1. ant debug  

在bin下就得到了HelloJni-debug.apk,用adb install即可进行安装了。


转自:http://blog.youkuaiyun.com/baby313/article/details/7312607


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值