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

Androidwebkit内核JNI层与Java层 函数互相调用方法

Java层调用JNI层函数:

例子

Java: BrowserFrame::loadurl( ) 

       - 调用JNI别名: Nativeloadurl() ;

JNI 层:WebFrame::loadurl( ) ;

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

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

2. @ 将java层中该类中的函数对应JNI层中的函数,以方便调用之。

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

  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);

    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值