如何使用QAndroidJniObject在Qt C++中使用原生的android webview

dal*_*t97 13 c++ java qt android webview

我想在我的qml应用程序中使用Android WebView.提供的默认WebView对象使用本机呈现,但缺少多个功能(例如,拦截网络请求并阻止它们的能力).我知道Qt允许您使用QAndroidJniObject调用本机Java API.是否可以使用它来创建本机Android WebView周围的Qt包装器?如果是,我该如何实现?

Max*_*mer 3

这很棘手。您基本上需要在运行时创建一个新类来覆盖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
    }
}
Run Code Online (Sandbox Code Playgroud)

要动态创建类,您必须用 Java 即时编译代码:

String source = ...;
int result = com.sun.tools.javac.Main.compile(new String[]{source});  // parameter is an array
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

之后,您应该能够使用自己的类创建一个 Web 视图客户端并使用它:

QAndroidJniObject myWebViewClient{"SuperDuperUniqueNameForMyWebViewClient"};
Run Code Online (Sandbox Code Playgroud)

对这一切持保留态度,因为这是我的想法,我还没有测试过。不过,至少它应该将你推向正确的方向。