/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com

*site:http://www.idealpwr.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文件,在末尾添加如下语句,具体根据自己的情况而定。

   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函数的)

#include <string.h>#include <jni.h>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的编写格式,下一篇博文补全

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)#LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写LOCAL_MODULE    := HelloWorldLOCAL_SRC_FILES := HelloWorld.cinclude $(BUILD_SHARED_LIBRARY)

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

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


5、新建一个Android工程

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

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和,后缀名不用写 }}


效果图:

Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld_第1张图片





更多相关文章

  1. Android Camera子系统代码流程1
  2. android文件缓存,并SD卡创建目录未能解决和bitmap内存溢出解决
  3. 【Demo实例】Android FTP上传带进度条(优化后代码)
  4. android全屏设置代码
  5. Android中一些比较好的开源代码项目
  6. eclipse中运行android工程启动失败的问题
  7. 【分享】大量android软件开发资料和实例代码【转】
  8. Eclipse Android 代码自动提示功能
  9. 【Android 应用开发】 Android 相关代码规范 更新中 ...

随机推荐

  1. android之sharedpreference读取参数
  2. Android Notification 填充 自定义布局
  3. android的service如何接收触摸事件。
  4. Android时间工具类 本地转UTC,UTC转本地
  5. Android中GridView来显示图片
  6. Android菜单实现两种方式
  7. android edittext编辑框光标改变事件
  8. android之File
  9. android 获取wifi 信号质量
  10. android 自定义TextView中Html超链接点击