Android browser kitkat中关于jni的调用
来源:互联网 发布:手机上怎么查淘宝评价 编辑:程序博客网 时间:2024/05/23 14:25
#############################################
本文为极度寒冰原创,转载请注明出处
#############################################
曾经有一位心目中的大牛说过一句话,chromium中有很多很多的新技术。这些让你非常的着迷,而现在android kitkat的面试,会将这些新技术让更多的人去了解。
今天,就将去研究一下kitkat的browser关于jni的调用。
首先在4.4之前的版本上面,jni的调用一般是这样实现的。
在java端:
声明一个native函数
private native void nativeLoadUrl(String url, Map<String, String> headers);使用的时候:
public void loadUrl(String url, Map<String, String> extraHeaders) { mLoadInitFromJava = true; if (URLUtil.isJavaScriptUrl(url)) { // strip off the scheme and evaluate the string stringByEvaluatingJavaScriptFromString( url.substring("javascript:".length())); } else { nativeLoadUrl(url, extraHeaders); } mLoadInitFromJava = false; }
而在cpp端,会有一个native method数组,比如
static JNINativeMethod gBrowserFrameNativeMethods[] = { /* name, signature, funcPtr */ { "nativeCallPolicyFunction", "(II)V", (void*) CallPolicyFunction }, { "nativeCreateFrame", "(Landroid/webkit/WebViewCore;Landroid/content/res/AssetManager;Landroid/webkit/WebBackForwardList;)V", (void*) CreateFrame }, { "nativeDestroyFrame", "()V", (void*) DestroyFrame }, { "nativeStopLoading", "()V", (void*) StopLoading }, { "nativeLoadUrl", "(Ljava/lang/String;Ljava/util/Map;)V", (void*) LoadUrl },
然后就可以找到这个函数的具体实现:
static void LoadUrl(JNIEnv *env, jobject obj, jstring url, jobject headers)
但是现在的kitkat中,因为是使用的chromium的引擎。所以流程发生了一些改变:
java端:
public void loadUrl(LoadUrlParams params) { if (mNativeContentViewCore == 0) return; nativeLoadUrl(mNativeContentViewCore, params.mUrl, params.mLoadUrlType, params.mTransitionType, params.mUaOverrideOption, params.getExtraHeadersString(), params.mPostData, params.mBaseUrlForDataUrl, params.mVirtualUrlForDataUrl, params.mCanLoadLocalResources); }在cpp端的h文件中,会直接继承并声明
class ContentViewCoreImpl : public ContentViewCore, public NotificationObserver {
然后函数会用Jni的参数来进行声明:
void LoadUrl( JNIEnv* env, jobject obj, jstring url, jint load_url_type, jint transition_type, jint ua_override_option, jstring extra_headers, jbyteArray post_data, jstring base_url_for_data_url, jstring virtual_url_for_data_url, jboolean can_load_local_resources);这样就省却了声明native method的操作。
再往下面就是函数的实现了:
void ContentViewCoreImpl::LoadUrl( JNIEnv* env, jobject obj, jstring url, jint load_url_type, jint transition_type, jint ua_override_option, jstring extra_headers, jbyteArray post_data, jstring base_url_for_data_url, jstring virtual_url_for_data_url, jboolean can_load_local_resources) { DCHECK(url); NavigationController::LoadURLParams params( GURL(ConvertJavaStringToUTF8(env, url))); params.load_type = static_cast<NavigationController::LoadURLType>( load_url_type); params.transition_type = PageTransitionFromInt(transition_type); params.override_user_agent = static_cast<NavigationController::UserAgentOverrideOption>( ua_override_option); if (extra_headers) params.extra_headers = ConvertJavaStringToUTF8(env, extra_headers); if (post_data) { std::vector<uint8> http_body_vector; base::android::JavaByteArrayToByteVector(env, post_data, &http_body_vector); params.browser_initiated_post_data = base::RefCountedBytes::TakeVector(&http_body_vector); } if (base_url_for_data_url) { params.base_url_for_data_url = GURL(ConvertJavaStringToUTF8(env, base_url_for_data_url)); } if (virtual_url_for_data_url) { params.virtual_url_for_data_url = GURL(ConvertJavaStringToUTF8(env, virtual_url_for_data_url)); } params.can_load_local_resources = can_load_local_resources; LoadUrl(params);}
这下应该就是一个完整的jni调用了 ~~~
- Android browser kitkat中关于jni的调用
- android browser 的几个小feature (四) kitkat上实现UaProfile的设置
- Android中JNI调用
- android中jni学习——jni的调用
- 《Android JNI》05 在JNI中调用Java的函数
- 关于android中JNI层的理解
- android JNI的调用
- Android WebView不调用默认的 Browser
- android 关于jni调用出错的那些事
- 关于掌纹识别的android版本开发(实例调用JNI)
- 关于Android调用JNI出现的 java.lang.UnsatisfiedLinkError
- 关于android进行jni调用时.so文件的兼容问题
- Android Framework中JNI调用
- Android中建立JNI调用
- Android 4.4(KitKat)中VSync信号的虚拟化
- Android 4.4 KitKat中SecretKeyFactory API的变动
- Android 4.4(KitKat)中apk包的安装过程
- Android 4.4(KitKat)中VSync信号的虚拟化
- 内容匹配广告投放技术7:品牌展示广告(三)(百度文库课程)
- oracle 复制table
- C#有关多线程的问题
- 转发QT(1)
- 习惯
- Android browser kitkat中关于jni的调用
- Qt - 模态对话框与非模态对话框
- 用MyEclipse搭建SSH框架 Struts Spring Hibernate
- v4l2 编程接口 driver
- iOS学习笔记20131121
- linux下的Python学习(4)
- DES 3DES AES Blowfish 对称加密算法比较
- C++ map的基本操作和使用
- 1-1.xml小部件