首页 > 解决方案 > 使用 J2V8 时出现异常:SyntaxError: Cannot use import statement outside a module

问题描述

我想在我的 android 应用程序中使用 j2v8 来运行用 js 编写的现有代码。

现有的 js 文件有十多个,它们互相调用。

当我编写单个测试 js 文件并执行代码时,它运行良好,但是当我想运行实际的 js 文件时,它会抛出异常并且应用程序退出。

使用 j2v8 的代码如下所示:

V8 runtime = V8.createV8Runtime();
String jsContent = getFileContent("security/security.js", this.getBaseContext());
runtime.executeModule(jsContent, "", "", "file:///android_asset/security/");
Object obj = runtime.executeJSFunction("initPrepare");

运行executeModule方法时应用程序退出,我尝试了executeScriptexecuteVoidScript方法,都失败了。

错误消息如下所示:

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.testapplication, PID: 26701
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
        at android.view.View.performClick(View.java:7125)
        at android.view.View.performClickInternal(View.java:7102)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27336)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
        at android.view.View.performClick(View.java:7125) 
        at android.view.View.performClickInternal(View.java:7102) 
        at android.view.View.access$3500(View.java:801) 
        at android.view.View$PerformClick.run(View.java:27336) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
     Caused by: file:///android_asset/security/:1: SyntaxError: Cannot use import statement outside a module
    import * as Crypto from "./jahport-crypto-wrapper.js";
    ^^^^^^
    com.eclipsesource.v8.V8ScriptCompilationException
        at com.eclipsesource.v8.V8._executeScript(Native Method)
        at com.eclipsesource.v8.V8.executeScript(V8.java:1134)
        at com.eclipsesource.v8.V8.executeModule(V8.java:737)
        at com.example.testapplication.MainActivity.jsTest(MainActivity.java:72)
            ... 13 more
I/Process: Sending signal. PID: 26701 SIG: 9
Disconnected from the target VM, address: 'localhost:63197', transport: 'socket'

我已经在 google 中搜索了错误消息,我能找到的所有答案都是即将在标签中添加“type=module”,但我使用的是 js 文件并且它没有标签。

谁能帮我这个?使用 j2v8 或不使用 j2v8 解决此问题的任何方法,我只想在我的应用程序中运行 js 文件,无论如何。

标签: javascriptandroidj2v8

解决方案


推荐阅读