一.NDK是什么
NDK是Native Development kit的缩写,即本地开发工具包,它支持用C/C++方式来开发Android,而SDK是用Java来开发Android。这样在安卓平台上就实现了Java+C/C++的开发方式。两者可以通过JNI (Java Native Interface)来互相调用。关于它们的关系如下图所示:
二.NDK的作用
1.便于程序的移植,实现跨平台
2.提高程序的性能,像一些特定模块,比如图像处理,音视频开发等
3.防止核心代码被反编译,
三.编写一个NDK的例子
1.下载Android NDK
下载地址: 点击打开链接(需要翻墙),也可以去百度上搜一下
下载下来如图: 我的是NDK8
如果你用的是NDK7之前的版本,那么你还需要去下载cygwin软件,它模拟了Linux环境,下载地址:点击打开链接, 具体的环境配置我就不过多介绍了.
当然已经没必要去这样弄了,NDK7之后的版本已经集成了Linux编译环境,操作简单的多.
2. 在eclipse中集成C/C++开发环境 ADT
(1).下载ADT,链接: http://www.eclipse.org/cdt/downloads.php ,找到自己eclipse对应的版本,可以在eclipse中的.eclipseproduct文件中看到版本信息
如图:
在下载页面有对应的ADT版本,是与版本名称对应的,如图
我的4.2,对应Juno,则在下载页面对应Juno
(2)复制这个链接,打开eclipse上的help菜单,选择Install New Software选项,弹出一个窗口
(3)点击Add,把复制的链接粘贴进去,出现插件列表后点击Selec tAll, 然后next下一部,就可以等待安装完成了
3.Eclipse关联ndk-build
这样不用我们打开ndk-build命令去手动编译了,eclipse自动编译,多省事
(1).Project->Properties->Builders->New,新建一个Builder
(2).输入name, Location输入ndk-build的路径,Working Directory输入自己项目路径
(3)点击Refresh选项
(4).点击Build Options选项
).
(5).点击Specify Resources
4.新建一个android工程,在MainActivity里输入如下代码
public class MainActivity extends Activity {
// 1.定义一个本地方法
public native String fromc();
// 2.加载so文件
static {
System.loadLibrary("hello_jni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 3.谈一个吐司,内容是从C++实现的
Toast.makeText(MainActivity.this, fromc(), 0).show();
}
});
}
}
这个hello_jni的so文件需要我们先编写C++代码,然后自动编译生成.我们新建一个jni目录,再新建一个hello.c文件.
hello.c代码中,jstring表示返回字符串类型,这里方法名要注意,前面以Java开头,后面加上包名类名方法名,中间用下划线分割
不要忘了加上string.h,jni.h等头文件
#include <string.h>
#include <jni.h>
//jstring 表示返回字符串
//传入env,obj参数
//调用NewStringUTF方法
//
jstring Java_com_example_ndkdemo_MainActivity_fromc(JNIEnv* env,jobject obj)
{
return (*env)->NewStringUTF(env,"hello");
}
最后编写Android.mk文件, 放在jni目录下,mk文件及makefile文件,指定了编译的配置信息.
LOCAL_PATH := $(call my-dir) //LOCAL_PATH变量,用于查找源文件,固定的写法
include $(CLEAR_VARS) //指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量,固定写法
LOCAL_MODULE := hello_jni //表示编译生成的名称
LOCAL_SRC_FILES := hello.c //表示要编译的模块
include $(BUILD_SHARED_LIBRARY) //编译生成共享库
当你写好mk文件后,保存之后会发现源代码目录多了个obj目录,里面就有我们要的so文件.
现在把你的程序运行起来就可以了。
Demo地址: 点击打开链接 密码:ms4v