您的位置:首页 > 移动开发 > Android开发

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

2014-11-04 20:51 633 查看


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


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 JNINativeMethod* gMethods, 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, msendDownloadRequest, viewcore->getWebViewJavaObject(),jUrl);

// viewcore->getWebViewJavaObject() 为 arg1 .

// jURL 为arg2 .

env->DeleteLocalRef(jUrl);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: