我们都知道Android的FrameWork以Java语言来实现,上层app都是通过java接口调用实现功能,而下层的库都是通过C/C++来实现。我们还是来看下Android的架构图,
其中的Application和FrameWork都是Java代码,其下的Library是C++代码,如何来实现java代码转调C++代码,其中jni做了很多工作。
先看下Jni的使用实例:
1.
package com.example.myapp;
public class media {
static {
System.LoadLibrary("mymedia");
}
public native void Decode() ;
}
JNIEXPORT void JNICALL Java_com_example_myapp_Decode()
{
}
这两个函数是如何对接上的呢?
在Jni.h文件中有个结构体JNINativeMethod,实现两者之间的对应关系:
typedef struct {
const char* name;//java函数名
const char* signature; //Java函数的签名信息
void* fnPtr; //指针地址
} JNINativeMethod;
在定义一组上面的对应关系后,再将此组变量给JNIEnv变量注册,实际上就是填写在一个函数对应表当中,以后java代码调用到Native Decode()方法,查当前env的函数对应表,找到与签名相匹配的函数地址,再调用到C++函数。
通过调用AndroidRuntime::registerNativeMethod(JNIEnv* env, const char* classname, const JNINativeMethod* method, int numMethods),将上述结构体内容注册到线程环境变量中。
此函数放在AndroidRunTime.h中声明,但外部引用不到,所以外部不能用。只能在framework之下使用。