Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use native android webview in Qt C++ using QAndroidJniObject

I would like to use the Android WebView in my qml application. The default WebView object provided uses native rendering but several features are missing (for example the ability to intercept network requests and block them). I know that Qt allows you to call native Java API using QAndroidJniObject. Is it possible to use that to create a Qt wrapper around the native Android WebView? If yes, how can I achieve that?

like image 513
reckless Avatar asked Sep 21 '17 01:09

reckless


1 Answers

This is tricky. You basically need to create a new class during runtime that overrides 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
    }
}

To create the class dynamically, you muste compile the code on-the-fly in Java:

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

Which in Qt C++ gives us this:

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);

After that you should be able create a web view client with your own class and use it:

QAndroidJniObject myWebViewClient{"SuperDuperUniqueNameForMyWebViewClient"};

Take all of this with a grain of salt, as it is from the top of my head and I haven't tested it. At the very least it should push you in the right direction, though.

like image 56
Max Vollmer Avatar answered Nov 01 '22 07:11

Max Vollmer