Android JNI如何将Java和Native对应

来源:互联网 发布:java web start 5.0 编辑:程序博客网 时间:2024/06/01 07:14

我们都知道Android的FrameWork以Java语言来实现,上层app都是通过java接口调用实现功能,而下层的库都是通过C/C++来实现。我们还是来看下Android的架构图,

Android架构图(图片来源:http://developer.Android.com/guide/basics/what-is-Android.html)


其中的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之下使用。