在JNI层实现数据页面切换 操作指引

前言

日常实际开发桥接包时,需要实现网络请求数据、页面判断跳转,并且实现网页加载URL、JS注入以及实现跨域功能。
这些功能代码量少,逻辑类似,因此容易导致代码重复度过高。并且这一块代码逻辑简单,反编译后容易阅读,从而造成安全性问题。
所以,我们尝试把逻辑代码迁移到C层实现,从而实现逻辑稳定性与安全性。

核心流程介绍

下面按照时间顺序介绍一下具体的流程:

1、原生层-Application

实现InstallReferrerClient,获取当前APP的渠道安装来源,并将安装来源的字符串写入SharedPreference文件。
SharedPreference文件使用默认的,也就是:包名_preferences.xml
注意key值,Demo中使用的是"install",根据项目修改。

2、原生层-MainActivity

定义并调用native重的init函数,实现AB面页面跳转。
优先初始化Shared Preference,如果担心存在并发时间差,Activity可以延迟3S进行native初始化以及调用。
函数名需要修改。


image.png

3、C++层 Java_com_test_MainActivity_init方法

与第2步一致,函数名需要进行同步修改。
该函数进行网络请求,根据返回值判断逻辑页面:例如:
1-直接进入A面主Activity;
3-直接进入B面主Activity;
2-则读取第1步获取到的渠道来源并写入的key,再判断是进入A面还是B面。
注意:下面的Activity的类名都要修改为自己包里的类名。


image.png

4、 原生层 B面WebViewActivity类启动

类中需要定义一个webview,并定义两个native函数;


image.png

由于webviewactivity页面初始化了webview,暴露了出来,需要实现一个回调函数,目前无法在C层实现,可能存在风险。(后续优化)
回调方法如下:


image.png

另外还有一个问题,js的注入必须在UI线程,所以尽管我们在C++层实现了js注入,但是还 得在java层单独处理,具体如下:


image.png

5.、C++层 Java_com_test_ioi_JNIWebActivity_init方法

完成B面主Activity的WebView动态创建和内容加载。
创建WebView,设置相关参数并实现相关逻辑,重点需要看的是载入URL。
因为有一个功能:如果首次进入B面,需要保存B面的URL,再次进入将直接使用已保存的B面URL。


image.png

上面实现了简单的加密方式进行保存B面URL,通过数字对换,字母大小写对换实现。

因为是对换,所以加解密通过同一个函数进行实现,具体明文和密文对比:
"https://m.705.games?code=9424533" ====》"sggkh://n.294.tznvh?xlwv=0575466"
接下来要调用java层的addJavascriptInterface方法设置一个接口类。
这个类必须先在Java层定义和实现,主要完成B面H5的回调和AF/AD的数据上包功能。
其具体定义和实现和之前java方案是一样的。

目前Demo中这部分的代码和之前一样,后面正式集成时,可尝试将其方法转换为native


image.png

6、C++层 Java_com_test_ioi_JNIWebActivity_getinfo方法

当WebView载入完内容后,需要回调当前函数完成js的注入。


image.png

同步修改

1、直接copy demo的 C++部分,也就是JNI目录。

2、直接copy demo的 build.gradle的部分。要特别注意红框中的部分:

image.png

image.png

image.png

3、修改C++的代码

1、首先需要访问的URL和SharedPreference的key

这里的可以要同步修改java层APP类中的相关方法。


image.png

2、其次是so库的名字。

这里要同时修改CMakeList.txt 和Java层对该so库的调用。

3、然后是native方法的名字。

整个方案总共定义了3个native方法,分别是:

Java_com_test_MainActivity_init
Java_com_test_ioi_JNIWebActivity_init
Java_com_test_ioi_JNIWebActivity_getinfo

4、修改Java的代码

1、主Activity

新增一个native方法,实现A/B面跳转。

2、B面主Activity

新增两个native方法,并调用webview.setWebViewClient。

3、主App类

调用InstallReferrerClient,记录信息到preference文件中。

4、JavascriptInterface的工具类

后面会尽量将它的内容也放到JNI层实现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容