Android之webkit内核JNI层与Java层 函数互相调用方法

Android之webkit内核JNI层与Java层 函数互相调用方法

Java层调用JNI层函数:

例子

Java: BrowserFrame::loadurl( ) 

       - 调用JNI别名: Nativeloadurl() ;

JNI 层:WebFrame::loadurl( ) ;

 

1、将java层中的函数对应JNI层中的函数,以方便调用之。


在JNI层定义需要用的函数WebFrame::loadurl( )


      static void LoadUrl(JNIEnv *env, jobject obj, jstring url)


-----------------------------------------------------------------------------------------

  jniRegisterNativeMethods(JNIEnv* env, const char* className,

const JNINativeMethodgMethods, int numMethods)

// className java层的类名

// gMethods :对应JNINativeMethod的数组。

------------------------------------------------------------------------------------------

typedef struct { 

    const char* name; //函数名(java层中声明)

    const char* signature; // 函数参数

          void* fnPtr; // 函数指针(指向JNI层 -> WebFrame::loadurl( ) )

JNINativeMethod;

------------------------------------------------------------------------------------------

Eg.  将如上JNI函数使用别名:Nativeloadurl( ) (java层中声明),存于注册数组中。

JNINativeMethod gMethods[]={

{ "nativeLoadUrl", "(Ljava/lang/String;)V", (void*) LoadUrl }

...

}

------------------------------------------------------------------------------------------


2. Java层中声明并调用函数:nativeLoadUrl(String url)


    声明:

private native void nativeLoadUrl(String url);

    调用:

      nativeLoadUrl(url);

JNI层调用Java函数:

    void Download::transportUrl(WebCore::FrameView* view, WebCore::String url)

    {

        WebViewCore* viewcore = WebViewCore::getWebViewCore(view);

        JNIEnv* env = JSC::Bindings::getJNIEnv();

        jstring jUrl =  env->NewString(url.characters(), url.length());

// 1. 获得Java该类的 jclass对象

        jclass mODP = env->FindClass("archermind/webkit/Observor/ODP");

// 2. 通过该对象,取得相应java函数及参数到 -> jmethodID中

        jmethodID msendDownloadRequest = env->GetStaticMethodID(

mODP, "sendDownloadRequest",                                          "(Larchermind/webkit/core/WebView;Ljava/lang/String;)V");

// 3. 在JNI层中,通过函数调用CallStaticVoidMethod来调用java函数。

        env->CallStaticVoidMethod(mODP, msendDownloadRequestviewcore->getWebViewJavaObject(),jUrl);

// viewcore->getWebViewJavaObject() 为 arg1 .

// jURL 为arg2 .

        env->DeleteLocalRef(jUrl);

    }

转自:http://blog.csdn.net/weiyouyin/article/details/5739659

你可能感兴趣的:(Android之webkit内核JNI层与Java层 函数互相调用方法)