工作中需要用到NDK开发。使用NDK开发的原因有两个,首先,可以防止人家反编译,底层毕竟都是c或者c++写的,其次,效率要高一些。作为基础篇,我尽量讲得详细一下。
首先需要去android官网去下载NDK开发包。如我下载的开发包。android-ndk-r10c.zip,可能不是最新的,我是去年下载的。
1. 通过eclipse创建一个NDKExample的项目。通过eclipse的菜单window->Preferences->Android 配置android-ndk-r10c.zip解压以后的路径。如图:
2. 添加动态库(*.so).
右击项目->Android Tools->Add Native Support...。出现如图界面:
可以修改so库的名称。Finish以后,就会增加JNI的文件。
内部有一个*.cpp文件,和一个makefile文件。
3. 在项目写一个Calculator计算器的类,这个类负责去调用c写成的函数。代码如下:
/**
* 计算器
* @author Administrator
*
*/
public class Calculator {
/**
* 加载c写的动态库
*/
static{
System.loadLibrary("NDKTest");
}
public native int add(int a, int b);
public native int sub(int a, int b);
}
4. 使用javah工具生成Calculator对应的头文件。
在windows平台上cmd进入该项目路径的src路径,比如我的路径为F:\workspace\android_svn\NDKExample\src。然后在命令行下使用:javah com.example.ndkexample.Calculator生成头文件。将头文件拷贝到JNI路径下。
拷贝过来以后,可能会报错,需要引用JNI.h头文件。项目右击属性->c/c++ General Path and Symbols->include -> add 选择NDK安装所在的路径include的,比如我的:D:\android-ndk-r10c\platforms\android-8\arch-arm\usr\include。
5. 具体实现c代码。
请注意使用javah生成的头文件时基于c语音的,如果是c++的话,还需要做一些处理,我将会在后续课程中介绍。
代码如下:
#include <jni.h>
#include "com_example_ndkexample_Calculator.h"
JNIEXPORT jint JNICALL Java_com_example_ndkexample_Calculator_add
(JNIEnv * env, jobject obj, jint a, jint b){
return a + b;
}
JNIEXPORT jint JNICALL Java_com_example_ndkexample_Calculator_sub
(JNIEnv * env, jobject obj, jint a, jint b){
return a - b;
}
修改android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NDKTest
LOCAL_SRC_FILES := NDKTest.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE: 表示so库的名称。
LOCAL_SRC_FILES:所有的c文件。
6. 看看java的层的处理。在含有native方法的这个类中需用使用
/**
* 加载c写的动态库
*/
static{
System.loadLibrary("NDKTest");
}
加载类库,其余的方式和普通的类是一样的。
7. 写一个测试代码,去调用add和sub方法。
final Calculator cal = new Calculator();
final EditText et1 = (EditText) findViewById(R.id.et_num1);
final EditText etOper = (EditText) findViewById(R.id.et_oper);
final EditText et2 = (EditText) findViewById(R.id.et_num2);
Button btn= (Button) findViewById(R.id.btn_ok);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int num1 = Integer.parseInt(et1.getText().toString().trim());
int num2 = Integer.parseInt(et2.getText().toString().trim());
String oper = etOper.getText().toString().trim();
if (oper.equals("+")){
int result = cal.add(num1, num2);
Toast.makeText(getApplication(), "result = " + result, 0).show();
}else{
int result = cal.sub(num1, num2);
Toast.makeText(getApplication(), "result = " + result, 0).show();
}
}
});
代码很简单,就不废话了。
代码下载地址为:下载
本篇博客为基础入门篇,后续会深入讲解。