/********************************************************************************************
 * author:conowen@大钟                                                                                                                          
 * E-mail:conowen@hotmail.com                                                                                                             
 * http://blog.csdn.net/conowen                                                                                                              
 * 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。     

 ********************************************************************************************/



1、Android NDK简介

NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发)。

简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jni(java  native interface)层开发,SDK开发可以称为上层开发。


2、为何要用NDK


2.1、众所周知,利用SDK编写的代码,生成的APK,很容易就可以反编译了,安全性极为不高,而利用NDK开发的库,不容易被反编译,保密性,安全性都提高了。

2.2、很多开源工程和大型工程都是C&C++代码,把它们转换为纯java语言显然是不可能的。

2.3、C&C++的代码运行速度和效率都比java快很多。


3、NDK环境的搭建

在http://developer.android.com/sdk/ndk/index.html下载最新版的NDK,然后解压到你喜欢的位置,然后把NDK的所在的目录,配置到环境变量里面就行。

如我在windows下面用cygwin开发。配置环境变量可以参考http://blog.csdn.net/conowen/article/details/7518870


简单来说就是在linux或者cygwin的安装目录,跳转到/home/YourName/,然后编辑.bash_profile文件,在末尾添加如下语句,具体根据自己的情况而定。

[java] view plain copy print ?
  1. ndk=/home/conowen/android-ndk-r7b  
  2.   
  3. export ndk  
   ndk=/home/conowen/android-ndk-r7b    export ndk


4、新建一个NDK工程

新建一个目录,命名为HelloWorld,然后在里面新建一个名为jni的目录(名称一定要是jni,因为ndk-build的时候会在HelloWorld目录下寻找jni的目录,然后进行build),在jni目录下新建如下文件HelloWorld.c和Android.mk。

HelloWorld.c文件代码如下(此JNI是没有jni_onLoad函数的)

[java] view plain copy print ?
  1. #include   
  2. #include   
  3.   
  4. jstring  
  5. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,  
  6.                                                   jobject thiz )  
  7. {  
  8.     return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");  
  9. }  
  10.   
  11.   
  12.   
  13.   
  14.  /*注意,这里 
  15.  
  16. jstring 表示返回值 
  17.  
  18. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI 
  19.  
  20. 写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。 
  21. 包名:com_conowen_helloworld 
  22. Activity名:HelloWorldActivity 
  23. 方法名:helloWorldFromJNI 
  24.  
  25. JNIEnv* env, jobject thiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。 
  26. */  
#include #include jstringJava_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,                                                  jobject thiz ){    return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");} /*注意,这里jstring 表示返回值Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。包名:com_conowen_helloworldActivity名:HelloWorldActivity方法名:helloWorldFromJNIJNIEnv* env, jobject thiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。*/

Android.mk代码如下

关于Android.mk的编写格式,下一篇博文补全

[java] view plain copy print ?
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4. #LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写  
  5. LOCAL_MODULE    := HelloWorld  
  6. LOCAL_SRC_FILES := HelloWorld.c  
  7.   
  8. include $(BUILD_SHARED_LIBRARY)  
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)#LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写LOCAL_MODULE    := HelloWorldLOCAL_SRC_FILES := HelloWorld.cinclude $(BUILD_SHARED_LIBRARY)

然后在终端里面,转到HelloWorld目录下,执行

[java] view plain copy print ?
  1. $ndk/ndk-build  
$ndk/ndk-build
$ndk是之前配置的NDK环境变量。编译成功后,会在在目录生成libs和obj两个文件夹,libs里面有刚刚编译成的libHelloWorld.so库。


5、新建一个Android工程

在eclipse里面新建一个Android工程,java代码如下,然后把刚刚生成的libs文件夹拖到Android工程目录下。

[java] view plain copy print ?
  1. package com.conowen.helloworld;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.TextView;  
  6.   
  7. public class HelloWorldActivity extends Activity {  
  8.     /** Called when the activity is first created. */  
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.   
  13.         TextView tv = new TextView(this);  
  14.         tv.setText(helloWorldFromJNI());  
  15.         setContentView(tv);  
  16.     }  
  17.   
  18.     public native String helloWorldFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了  
  19.   
  20.     static {  
  21.         System.loadLibrary("HelloWorld");// 加载库,前面的lib和,后缀名不用写  
  22.     }  
  23. }  
package com.conowen.helloworld;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class HelloWorldActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TextView tv = new TextView(this);        tv.setText(helloWorldFromJNI());        setContentView(tv);    }    public native String helloWorldFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了    static {        System.loadLibrary("HelloWorld");// 加载库,前面的lib和,后缀名不用写    }}


效果图:


更多相关文章

  1. android的振动器Vibrator
  2. 【Android(安卓)UI设计与开发】第14期:顶部标题栏(五)两种方式实现
  3. Android(安卓)DrawerLayout实现抽屉效果实例代码
  4. Android(安卓)图片选择器
  5. 【android】安卓开发学习路线图
  6. Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发
  7. Android(安卓)近百个项目的源代码,覆盖Android开发的每个领域
  8. Android(安卓)4.0 开发环境离线安装(Linux)
  9. Android(安卓)Kotlin开发模块之间跳转-ARouter

随机推荐

  1. Android中设置启动动画
  2. android 性能优化 之 Handler 正确写法
  3. Android(安卓)如何实现欢迎界面(Splash Sc
  4. Android中使用注解替代枚举
  5. Android(安卓)color
  6. Android(安卓)Studio 编译卡慢、卡顿的几
  7. Android(安卓)DDMS ADB启动失败错误解决!
  8. android bluetooth蓝牙移植
  9. Android(安卓)绘制一个Loading动画__向图
  10. Android-- Dialog对话框的使用方法