解决miniblink 回调函数 on_wkeDownload2Callback 返回值为kWkeDownloadOptCacheData 程序异常

接上篇,用miniblink 的GET方式下载文件,他的几个Demo 都可以下载文件。但是,如果用post data 方式,然后服务器返回 Content-Disposition 的文件头,而且要下载的数据在 response data里面的话,miniblink 是没有提供接口的。 一般来说,都是用wkeOnDownload 函数,设置好回调函数,在 typedef bool(WKE_CALL_TYPE*wkeDownloadCallback)(wkeWebView webView, void* param, const char* url); 中有 却只有 需要下载的 http,所以是  miniblink提供的API 是不能满足需求的。

还好,经过查看源码,有一个 wkeOnDownload2 函数,只是在 wke.cpp中存在,而在wke.h 中并没有提供出来,所以需要手动添加。这个接口。并且添加好接口后,还需要修改 miniblink 的源码。

添加接口与修改miniblink 源码的方法在如下:

1. 在wke.h 中 的 wkeDownloadCallback  下面添加如下代码,也就是添加 wkeDownload2Callback 回调函数的头文件。

typedef bool(WKE_CALL_TYPE*wkeDownloadCallback)(wkeWebView webView, void* param, const char* url);

typedef enum _wkeDownloadOpt {
	kWkeDownloadOptCancel,
	kWkeDownloadOptCacheData,
} wkeDownloadOpt;

typedef void* wkeNetJob;

typedef void(WKE_CALL_TYPE*wkeNetJobDataRecvCallback)(void* ptr, wkeNetJob job, const char* data, int length);
typedef void(WKE_CALL_TYPE*wkeNetJobDataFinishCallback)(void* ptr, wkeNetJob job, wkeLoadingResult result);

typedef struct _wkeNetJobDataBind {
	void* param;
	wkeNetJobDataRecvCallback recvCallback;
	wkeNetJobDataFinishCallback finishCallback;
}wkeNetJobDataBind;

typedef wkeDownloadOpt(WKE_CALL_TYPE*wkeDownload2Callback)(
	wkeWebView webView,
	void* param,
	size_t expectedContentLength,
	const char* url,
	const char* mime,
	const char* disposition,
	wkeNetJob job,
	wkeNetJobDataBind* dataBind);

2. 在wke.h 中 添加:

ITERATOR3(void, wkeOnDownload2, wkeWebView webView, wkeDownload2Callback callback, void* param, "") \  

位置如下:

    ITERATOR3(void, wkeOnDownload, wkeWebView webView, wkeDownloadCallback callback, void* param, "") \
	ITERATOR3(void, wkeOnDownload2, wkeWebView webView, wkeDownload2Callback callback, void* param, "") \

那么这样添加两处,就可以在 demo中调用  wkeOnDownload2 函数了。

不如如果在回调函数中 on_wkeDownload2Callback 的返回值为 kWkeDownloadOptCacheData 的话,程序为崩溃。但是呢,必须设置为kWkeDownloadOptCacheData 这个返回值,miniblink 才会去调用 

typedef void(WKE_CALL_TYPE*wkeNetJobDataRecvCallback)(void* ptr, wkeNetJob job, const char* data, int length);
typedef void(WKE_CALL_TYPE*wkeNetJobDataFinishCallback)(void* ptr, wkeNetJob job, wkeLoadingResult result);

这两个回调函数,所以需要查看源码

 wkeDownloadOpt WKE_CALL_TYPE Window::on_wkeDownload2Callback(wkeWebView webView, void* param, size_t expectedContentLength, const char* url, const char* mime, const char* disposition, wkeNetJob job, wkeNetJobDataBind* dataBind)
 {
	 wkeDownloadOpt opt = kWkeDownloadOptCacheData;


	 return opt;
 }

在miniblink中 

static bool dispatchDownloadToWke(WebPage* page, WebURLLoaderInternal* job, const utf8* url , const AtomicString& contentType)函数

-> 

if (kWkeDownloadOptCacheData == opt) {
        job->m_dataBind = new wkeNetJobDataBind();
        *(job->m_dataBind) = dataBind;

        return false;
    }

就是这个 return false,导致,后面的调用函数无法执行。 修改为 return true。然后在编译源码。调用 on_wkeDownload2Callback成功。

并且成功调用 wkeNetJobDataRecvCallback,并且在 wkeNetJobDataRecvCallback 中,可获取response 的data 也就是下载内容。

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
界面透明度247,所以软件看起来有点背景有图案花色的样子是因为背景的壁纸关系 调用了WKE引擎 通过HTML5 / JS /CSS 构造易语言UI窗口交互,使其富有更强大动画,视觉效果 本框架免费,无毒,无暗桩,请放心使用 增加了整体窗口UI美化,滚动条,标题栏,控制按钮关闭,缩小,全屏等常用组件 引擎使用了WKE,框架自行封装调用。 本人QQ:741896542  如需提问,欢迎加QQ 2016-12-07:     增加 wkeJSSimpleBind 接口,绑定简单的全局函数     渲染性能优化     增加一些不支持特性的兼容性     增加401验证回调接口: wkeOnResponseHttp401 2016-12-06:     修正手形鼠标     修正wkeWindowOnPaint返回值的默认处理     修正编辑事件     修正输入法位置 2016-11-15:     改进字体显示效果     Tip提示改为5秒后消失 2016-11-14:     修正alt(tips)显示问题     重新修改编码识别部分。目前没发现有识别错误的网站 2016-11-12:     增加透明webView的例子     修改文件系统接口回调为: wkeOnReadFile(...); 2016-10-20:     修正websocket关闭问题 2016-8-31:     修正gif动画花的问题     修正个别网站字体模糊问题 2016-8-29:     增加MimeType过滤接口     增加EnableNewWindow设置,如果为true, 那么将允许多进程窗口     增加下载接口     修正 JavascriptCore 一个浮点bug 2016-8-25     重写消息循环模式,重绘事件在独立线程完成     修正 Flash 不支持硬件加速的问题     提高js脚本下载优先级     重新加入C API模式     修正原本的几个bug     增加几个常用语言的识别 2016-8-22      加入JavascriptCore文字变量支持      优化 cairo 绘图性能 2016-8-17     修正mail.qq.com乱码问题     更新 curl到 7.50.1     加入未知编码自动识别判断 2016-8-13     加入WOFF图标显示支持     改进 Websocket支持     修正youku视频无法播放问题
好的,这里是一个简单的JNI接口回调函数的示例代码,可以帮助你更好地了解如何实现这个功能。 在Java层,我们有一个接口Java_JPG_desensitise_callback,它接收一个int类型的参数作为回调函数返回值。我们还有一个register_jpg_callback(callback)方法,该方法接收一个回调函数作为参数,并将其注册到JNI层。在JNI层,我们需要实现这个回调函数,并将其传递给Java层。 ```c++ // Java层定义的接口 public interface JPGDesensitiseCallback { void onDesensitise(int result); } // Java层定义的注册回调函数的方法 public static native void register_jpg_callback(JPGDesensitiseCallback callback); // JNI层定义的回调函数 void jpg_desensitise_callback(int result) { JNIEnv *env; jvm->AttachCurrentThread((void **)&env, NULL); jclass clazz = env->FindClass("com/example/JPGDesensitiseCallback"); jmethodID methodID = env->GetMethodID(clazz, "onDesensitise", "(I)V"); env->CallVoidMethod(callbackObj, methodID, result); jvm->DetachCurrentThread(); } // JNI层中的register_jpg_callback方法 JNIEXPORT void JNICALL Java_com_example_JPGDesensitiseCallback_register_1jpg_1callback(JNIEnv *env, jobject obj, jobject callback) { // 将Java层传递过来的回调函数保存到全局变量中 callbackObj = env->NewGlobalRef(callback); // 注册回调函数 register_jpg_callback(jpg_desensitise_callback); } ``` 在这个示例代码中,我们首先在Java层定义了一个JPGDesensitiseCallback接口,并在其中定义了一个onDesensitise方法,该方法接收一个int类型的参数作为回调函数返回值。我们还定义了一个register_jpg_callback方法,该方法接收一个回调函数作为参数,并将其注册到JNI层。 在JNI层,我们定义了一个名为jpg_desensitise_callback回调函数,并将其传递给Java层。在JNI层的register_jpg_callback方法中,我们将Java层传递过来的回调函数保存到全局变量中,并注册回调函数。当回调函数被调用时,我们可以通过JNI对象获取Java层的接口对象,并调用其onDesensitise方法,将结果返回给Java层。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chen249191508

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值