如何在Qt中使用原生Android Webview,C++使用QAndroidJniObject
我想在我的qml应用程序中使用Android WebView。提供的默认 WebView 对象使用本机呈现,但缺少一些功能(例如,拦截网络请求并阻止它们的功能)。我知道Qt允许你使用QAndroidJniObject调用原生Java API。是否有可能使用它来围绕原生Android WebView创建Qt包装器?如果是,我该如何实现?
我想在我的qml应用程序中使用Android WebView。提供的默认 WebView 对象使用本机呈现,但缺少一些功能(例如,拦截网络请求并阻止它们的功能)。我知道Qt允许你使用QAndroidJniObject调用原生Java API。是否有可能使用它来围绕原生Android WebView创建Qt包装器?如果是,我该如何实现?
这很棘手。你基本上需要在运行时创建一个新类来覆盖:shouldInterceptRequest
public class SuperDuperUniqueNameForMyWebViewClient extends android.webkit.WebViewClient {
// constructor etc...
@Override
public android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebView view, android.webkit.WebResourceRequest request) {
// implement your logic here
}
}
要动态创建类,您必须在Java中动态编译代码:
String source = ...;
int result = com.sun.tools.javac.Main.compile(new String[]{source}); // parameter is an array
在Qt C++中,它给了我们这个:
QString source = ...; // Here you need to provide the Java code for your class
QAndroidJniObject sourceObject = QAndroidJniObject::fromString(source);
jobjectArray sourceObjectArray = sourceObject.object<jobjectArray>(); // this is probably not correct
jint result = QAndroidJniObject::callStaticMethod<jint>("com/sun/tools/javac/Main",
"compile"
"([Ljava/lang/String;)I",
jobjectArray);
之后,您应该能够使用自己的类创建一个Web视图客户端并使用它:
QAndroidJniObject myWebViewClient{"SuperDuperUniqueNameForMyWebViewClient"};
把所有这一切都带了一粒盐,因为它是从我的头顶上来的,我还没有测试过。不过,至少它应该把你推向正确的方向。