/********************************************************************************************
* 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. exportndk


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<string.h>
  2. #include<jni.h>
  3. jstring
  4. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI(JNIEnv*env,
  5. jobjectthiz)
  6. {
  7. return(*env)->NewStringUTF(env,"HelloWorld!IamfromJNI!");
  8. }
  9. /*注意,这里
  10. jstring表示返回值
  11. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI
  12. 写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。
  13. 包名:com_conowen_helloworld
  14. Activity名:HelloWorldActivity
  15. 方法名:helloWorldFromJNI
  16. JNIEnv*env,jobjectthiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。
  17. */

Android.mk代码如下

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

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

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

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


5、新建一个Android工程

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

[java] view plain copy print ?
  1. packagecom.conowen.helloworld;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.widget.TextView;
  5. publicclassHelloWorldActivityextendsActivity{
  6. /**Calledwhentheactivityisfirstcreated.*/
  7. @Override
  8. publicvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. TextViewtv=newTextView(this);
  11. tv.setText(helloWorldFromJNI());
  12. setContentView(tv);
  13. }
  14. publicnativeStringhelloWorldFromJNI();//native声明,表示这个方法来自Native层。实现过程已经在native层实现了
  15. static{
  16. System.loadLibrary("HelloWorld");//加载库,前面的lib和,后缀名不用写
  17. }
  18. }


效果图:


更多相关文章

  1. Android(安卓)MainActivity如何加载BaseActivity的布局
  2. 百度地图SDK SDKInitializer.initialize(getApplicationContext(
  3. android的Drawable
  4. Android登录界面开发及响应;页面跳转;传参
  5. android studio debug framework
  6. Android(安卓)studio 开发一个用户登录界面
  7. Android(安卓)开发艺术探索 源码地址
  8. Android又凉了?2021年Android开发还被唱衰,开发者如何涅槃重生?
  9. 安卓端app开发!连续四年百度Android岗必问面试题!含泪整理面经

随机推荐

  1. Android利用Gradle多渠道打包如何动态替
  2. Android(安卓)Context.getSystemService(
  3. android Permission 访问权限许可 大全
  4. 【译】Android(安卓)6.0接口变化(一)(Androi
  5. android导入项目常见问题
  6. 史上最全面,清晰的SharedPreferences解析
  7. Android(安卓)Studio如何格式化XML代码顺
  8. Android(安卓)特殊符号的ASCII转码
  9. Android(安卓)Studio3.0及Gradle4.1带来
  10. Android(安卓)开源动画框架 NineOldAndro