Android中进行NDK和JNI开发的基本流程:
1首先明确几个基本概念
什么是NDK?什么是JNI?
NDK就是Native Develop Kit 的缩写,专门为Android平台下开发本地函数而准备的开发工具,所谓本地函数 就是开发C或C++函数或库。所谓JNI,就是Java Native Interface的缩写,Java本地接口,能够调用C的动态函数库.so文件。既然Java已经很强大,为什么还要在Android平台上开发C或C++呢?
原因有两个:1、有很多功能函数或库文件是使用C或C++编写的,虽然使用Java也能重新编写实现,但是既然已经有了实现的函数,为什么不直接拿来用呢?西方有句名言叫作“要发明轮子,但不要重复发明轮子!!”,我们只需要将已实现的函数拿过来用就可以了。没有必要再重复繁琐的工作 2、 Java语言容易通过反编译技术获取源代码,一些比较核心的算法代码容易被窃取,而采用C编写则不容易被反编译,保证安全性。
既然有些时候我们要用到C编程,然而Android平台是用Java编写的,怎么使用C呢?
那就要用到JNI了,JNI的具体作用:实现Java调用C动态函数库,所谓C动态函数库,就是在linux环境下编译后得到的.so文件。另一方面,我们编写好了自己的C源文件,如何将它整成符合要求的.so文件,使得Java能够成功调用?? 那就要使用上面介绍的另一个工具NDK,NDK可以可以将我们写好的源文件编译成符合要求的.so文件。
2,下面介绍一下基本的流程
首先要准备好开发工具:1,Android开发的Eclipse工具包括ADT;2,NDK
然后进行Android项目的开发:1,新建一个新的Android工程,包括包和Java文件2,在Java文件中声明要使用的本地函数(如Public native void add(int,int);等)3,
使用javah文件生成此Java文件对应的头文件(注意a,此头文件在编译时使用的是Java源文件,编译时要带包编译,如com.example.hellojni.HelloJni,则应该在com的上一级目录中经行编译,源文件名带上包的名字,最后就会生成com_example_hellojni_HelloJni.h的头文件,此头文件的作用:仅仅是给编写cpp源文件提供了一个模板,按照.h文件中的方式进行编写b, javah的使用格式javah -d “编译结果存放路径” -JNI -classpath “源文件路径” "源文件")。
4,利用eclipse中的native tools进行JNI文件夹的创建,此时会自动创建android.mk文件和一个空的cpp文件,保存之后就会自动生成.so文件(事先创建了 configuration tools,NDK,否则要终端手动编译)。
5,按照之前生成的.h文件格式进行cpp的编写;
6,若要使用其他的cpp,则编写对应的.h文件声明各个函数,并编写cpp文件实现函数;
7,在Android.mk文件中添加所有的cpp文件,添加后保存,即可自动编译生成.so文件
8,在Java文件中创建静态代码块,中加载刚才生成的.so文件,system.loadlibrary()(注意要删掉生成的文件名前面的"lib");
9,调用本地函数;
//
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("ytj", ""+add(1, 6));
Toast.makeText(getApplicationContext(), ""+add(1, 6), Toast.LENGTH_LONG).show();
}
public native int add(int a,int b);
static
{
System.loadLibrary("TestJni");
}
//cpp
#include <jni.h>
#include<com_example_testjni_MainActivity.h>
JNIEXPORT jint JNICALL Java_com_example_testjni_MainActivity_add (JNIEnv * env,jobject obj ,jint a,jint b)
{
return a+b;
}
//
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("ytj", ""+add(1, 6));
Toast.makeText(getApplicationContext(), ""+add(1, 6), Toast.LENGTH_LONG).show();
}
public native int add(int a,int b);
static
{
System.loadLibrary("TestJni");
}
//cpp
#include <jni.h>
#include<com_example_testjni_MainActivity.h>
JNIEXPORT jint JNICALL Java_com_example_testjni_MainActivity_add (JNIEnv * env,jobject obj ,jint a,jint b)
{
return a+b;
}