Android的NDK开发(2)————利用Android(安卓)NDK编写一个简单的HelloWorld
/********************************************************************************************
* 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文件,在末尾添加如下语句,具体根据自己的情况而定。
- ndk=/home/conowen/android-ndk-r7b
- 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 ?- #include<string.h>
- #include<jni.h>
- jstring
- Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI(JNIEnv*env,
- jobjectthiz)
- {
- return(*env)->NewStringUTF(env,"HelloWorld!IamfromJNI!");
- }
- /*注意,这里
- jstring表示返回值
- Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI
- 写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。
- 包名:com_conowen_helloworld
- Activity名:HelloWorldActivity
- 方法名:helloWorldFromJNI
- JNIEnv*env,jobjectthiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。
- */
Android.mk代码如下
关于Android.mk的编写格式,下一篇博文补全
[java] view plain copy print ?- LOCAL_PATH:=$(callmy-dir)
- include$(CLEAR_VARS)
- #LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写
- LOCAL_MODULE:=HelloWorld
- LOCAL_SRC_FILES:=HelloWorld.c
- include$(BUILD_SHARED_LIBRARY)
然后在终端里面,转到HelloWorld目录下,执行
[java] view plain copy print ?- $ndk/ndk-build
5、新建一个Android工程
在eclipse里面新建一个Android工程,java代码如下,然后把刚刚生成的libs文件夹拖到Android工程目录下。
[java] view plain copy print ?- packagecom.conowen.helloworld;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.widget.TextView;
- publicclassHelloWorldActivityextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- TextViewtv=newTextView(this);
- tv.setText(helloWorldFromJNI());
- setContentView(tv);
- }
- publicnativeStringhelloWorldFromJNI();//native声明,表示这个方法来自Native层。实现过程已经在native层实现了
- static{
- System.loadLibrary("HelloWorld");//加载库,前面的lib和,后缀名不用写
- }
- }
效果图:
更多相关文章
- Android(安卓)MainActivity如何加载BaseActivity的布局
- 百度地图SDK SDKInitializer.initialize(getApplicationContext(
- android的Drawable
- Android登录界面开发及响应;页面跳转;传参
- android studio debug framework
- Android(安卓)studio 开发一个用户登录界面
- Android(安卓)开发艺术探索 源码地址
- Android又凉了?2021年Android开发还被唱衰,开发者如何涅槃重生?
- 安卓端app开发!连续四年百度Android岗必问面试题!含泪整理面经