Android utiliza o V8 sem o WebView

Estou exercitando a execução de javascript a partir de Java. O Rhino funciona muito bem para isso na área de trabalho, mas precisa voltar ao modo (lento) interpretado no Android (devido ao dalvik não conseguir executar o bytecode Java que o Rhino JIT compila).

@Android possui seu mecanismo javascript V8 embutido, que é acessado internamente via JNI e deve oferecer desempenho muito melhor que o Rhino; no entanto, a única maneira de encontrar para acessá-lo é indiretamente através de um WebView.

Infelizmente, o WebView requer um Contexto e trava com o NPE com um contexto nulo, por isso não consigo instanciar um WebView fictício apenas para executar o código e retornar o resultado. A natureza do meu exercício realmente não me permite fornecer um Contexto para o WebView, então espero que talvez haja algo que estou ignorando.

Vários desses V8Threads são executados em paralelo, por isso não é realmente viável (tanto quanto eu saiba) adicionar um WebView ao meu layout e ocultá-lo, pois não acredito que um único WebView possa executar funções em vários threads.

private class V8Thread extends Thread
{
    private WebView webView;
    private String source;

    private double pi;
    private int i, j;

    public V8Thread(int i, int j)
    {
        pi = 0.0;
        this.i = i;
        this.j = j;

        source = "";

        try {
            InputStreamReader isReader = new InputStreamReader(assetManager.open("pi.js"));
            int blah = isReader.read();
            while (blah != -1)
            {
                source += (char)blah;
                blah = isReader.read();
            }

            webView = new WebView(null);
            webView.loadData(source, "text/html", "utf-8");
            webView.getSettings().setJavaScriptEnabled(true);
            webView.addJavascriptInterface(this, "V8Thread");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public double getResult()
    {
        return pi;
    }

    @Override
    public void run() 
    {
        webView.loadUrl("javascript:Androidpicalc("+i+","+j+")");
    }
}

Idealmente, deve haver alguma maneira suportada de chamar a V8 diretamente, ou pelo menos executar o javascript sem a necessidade de um WebView real, pois parece um método complicado e complicado apenas para executar o código javascrip

ATUALIZA

Reorganizei meu código um pouco, embora não seja visto aqui agora, estou instanciando o V8Threads no onPreExecute () do AsyncTasks, mantendo todo o resto em doInBackground (). O código-fonte é lido anteriormente no programa, portanto, não é redundantemente relido para cada threa

Por que agora o V8Thread é instanciado no thread da interface do usuário, posso passar o contexto da visualização atual (estou usando fragmentos para não poder passar apenas "this"), para que não trava mai

private class V8Thread extends Thread
{
    private WebView webView;

    private double pi;
    private int i, j;

    public V8Thread(int i, int j)
    {
        pi = 0.0;
        this.i = i;
        this.j = j;

        source = "";

        webView = new WebView(v.getContext());
    }

    @SuppressWarnings("unused")
    public void setResult(String in)
    {
        Log.d("Pi",in);
    }

    public double getResult()
    {
        return pi;
    }

    @Override
    public void run()
    {
        webView.getSettings().setJavaScriptEnabled(true);
        webView.addJavascriptInterface(this, "V8Thread");
        webView.loadData(source, "text/html", "utf-8");
        //webView.loadUrl("javascript:Androidpicalc("+i+","+j+")");
        webView.loadUrl("javascript:test()");
        Log.d("V8Thread","Here");
    }
}

No entanto, ao executar, o logcat cospe um por thread do erro "Não é possível obter a viewWidth após o primeiro layout" e o código javascript nunca é executado. Sei que o thread é acionado completamente, porque a mensagem de log "Aqui" é enviada. Aqui está a função test () relevante no código js.

function test()
{
V8Thread.setResult("blah");
}

Trabalhando corretamente, "blah" deve aparecer quatro vezes no logcat, mas nunca aparece. Pode ser que meu código fonte seja lido incorretamente, mas duvido diss

Scanner scan = new Scanner(assetManager.open("pi.js"));
while (scan.hasNextLine()) source += scan.nextLine();

A única outra coisa que posso imaginar é que, devido a esses erros acima mencionados, o webView nunca chega a executar o javascrip

Acrescentarei também que o pi.js contém apenas javascript, sem HTML. No entanto, mesmo quando o envolvo em HTML apenas o suficiente para se qualificar como uma página da web, ainda não há sort