我已经使用J2V8库创建了android的代码,用于在android mobile中执行nodejs脚本.但是当我运行应用程序时,它给了我错误.
compile 'com.eclipsesource.j2v8:j2v8:4.6.0@aar'
Run Code Online (Sandbox Code Playgroud)
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_console);
runScript();
}
private void runScript() {
NodeJS nodeJS = NodeJS.createNodeJS();
try {
File script = createTempScript("console.log(\"Hello NodeJS\")");
nodeJS.exec(script);
script.delete();
} catch (Exception e) {
e.printStackTrace();
} finally {
nodeJS.release();
}
}
private File createTempScript(String script) throws IOException {
File file = File.createTempFile("temp",".js", getCacheDir());
FileWriter fileWriter = new FileWriter(file);
fileWriter.write(script);
fileWriter.close();
return file;
}
...
Run Code Online (Sandbox Code Playgroud)
java.lang.RuntimeException: Unable to start activity ComponentInfo{in.asissuthar.lion/in.asissuthar.lion.ConsoleActivity}: java.lang.UnsupportedOperationException:
StartNodeJS …
Run Code Online (Sandbox Code Playgroud) TLDR;
有什么办法告诉java联合国加载本机库,以便我可以重新加载它?(我知道它只能在单个类加载器中加载。请参见下文)。我知道当类加载器被垃圾回收时,它已被卸载,但是强制垃圾回收没有成功。有任何想法吗?
我发现了这个问题,这解释了为什么我遇到错误: .dll已在另一个类加载器中加载?
但这不是我想做的事。我们有一个jar,希望能够在运行时动态加载(插件样式),以便在另一个服务上运行一些规模测试。
它在第一次运行时运行良好,但是当我停止测试运行并尝试卸载以前的类加载器并加载新的类加载器时,出现以下错误:
Caused by: java.lang.UnsatisfiedLinkError: Could not load J2V8 library. Reasons:
no j2v8_macosx_x86_64 in java.library.path
Native Library /Users/brian.trezise/libj2v8_macosx_x86_64.dylib already loaded in another classloader
at com.eclipsesource.v8.LibraryLoader.loadLibrary(LibraryLoader.java:71)
at com.eclipsesource.v8.V8.load(V8.java:70)
at com.eclipsesource.v8.V8.createV8Runtime(V8.java:132)
... 8 more
Run Code Online (Sandbox Code Playgroud)
这是我的方法,该方法创建一个新的类加载器来动态加载我的jar,如果以前是它,则通过调用使它失效classLoader.close()
:
public void reloadJar(String jarName) throws IOException {
if (this.classLoader != null) {
classLoader.close(); //Invalidate the old class loader so we can load a new one
}
File file = new File(JAR_FILE_DIR + jarName);
if (!file.exists()) {
throw new IllegalStateException("The specified file …
Run Code Online (Sandbox Code Playgroud) 我在eclipse中有一个Java webapp.我已启用自动部署,因此每当我进行更改时,eclipse会自动将webapp重新部署到我的本地Tomcat服务器,而我所要做的就是刷新页面.到目前为止,这一直很好,很花哨.
但是,我最近添加了这种依赖:
<dependency>
<groupId>com.eclipsesource.j2v8</groupId>
<artifactId>j2v8_win32_x86_64</artifactId>
<version>3.1.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
此依赖项包括一些本机库(.dll
Windows计算机上的文件).当我手动部署时(通过右键单击项目,单击"运行方式"然后"在服务器上运行"),这样可以正常工作.我可以像我期望的那样使用库.
如果我然后进行更改(任何更改,甚至添加注释),eclipse会自动重新部署.但是当我尝试使用该库时(通过简单刷新页面并再次运行完全相同的代码),我收到此错误:
java.lang.UnsatisfiedLinkError: Could not load J2V8 library. Reasons:
no j2v8_win32_x86_64 in java.library.path
Run Code Online (Sandbox Code Playgroud)
所以看来eclipse无法在自动部署时加载本机库,即使它在我手动部署时工作正常.
java.library.path
但两种情况下的值相同:
C:\Program Files\Java\jdk1.8.0_65\bin;
C:\WINDOWS\Sun\Java\bin;
C:\WINDOWS\system32;
C:\WINDOWS;
C:\ProgramData\Oracle\Java\javapath;
C:\Program Files\ImageMagick-6.9.0-Q16;
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
C:\Program Files\ImageMagick-6.8.9-Q16;
C:\Program Files\Java\jdk1.8.0_65;
c:\Program Files (x86)\Intel\iCLS Client\;
c:\Program Files\Intel\iCLS Client\;
C:\WINDOWS\system32;
C:\WINDOWS;
C:\WINDOWS\System32\Wbem;
C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;
C:\Program Files\WIDCOMM\Bluetooth Software\;
C:\Program Files\WIDCOMM\Bluetooth …
Run Code Online (Sandbox Code Playgroud) 我正在使用J2V8在Android上执行JavaScript代码.在我的Java代码中,我可以访问和执行单独的.js文件的JavaScript函数吗?如果有可能,我该怎么办?
谢谢:
伯纳特
以前曾提出过类似的问题,但没有吸引力。显然,这是可能的,但目前还不清楚如何在我们自己的非 tabris Android 应用程序中做到这一点。
关于此事我们拥有的最好的文档是这个提交,但我V8.setFlags("--expose-debug-as=Debug");
也尝试过V8.setFlags("--expose-debug-as=" + DebugHandler.DEBUG_OBJECT_NAME);
,但 Chrome 开发人员工具中没有出现可调试的应用程序。
我什至尝试与启用 Stetho 组合使用,在这种情况下我能够调试该应用程序,但没有可调试的 javascript 源。我相信我已经很接近了,但还缺少一个关键的小细节。
我有一个使用J2V8的Android应用程序,并希望使用Stetho创建一个我可以在Chrome开发工具中使用的调试桥.
有没有关于如何将Stetho连接到我正在使用的V8运行时的文档?
我想在Java项目中包含Java Bindings for V8("J2V8").原因是(i)V8 JavaScript引擎比JRE附带的JavaScript引擎快得多,并且(ii)我使用的库仅在JavaScript中可用,并且Java的端口是非常省力的.
问题是J2V8是针对不同平台编译的:linux 64bit,macos 64bit,windows 64 bit,windows 32 bit.
我现在想要生成不同的JAR,包含所有依赖项(fat jar):
jabref-linux_x86_64.jar
jabref-macosx_x86_64.jar
jabref-windows_x86_32.jar
jabref-windows_x86_64.jar
jabref-all.jar
- 没有v8引擎的平台独立JAR我目前正在使用shadow插件创建胖罐.
请注意,该项目不是 Android项目.在那里,使用Android插件,这似乎是直截了当的.
第一个想法是引入配置和特定于配置的依赖项:
configurations {
linux_x86_64Compile.extendsFrom compile
macosx_x86_64Compile.extendsFrom compile
windows_x86_32Compile.extendsFrom compile
windows_x86_64Compile.extendsFrom compile
}
dependencies {
compile configuration: 'linux_x86_64', group: 'com.eclipsesource.j2v8', name: 'j2v8_linux_x86_x64', version: '4.6.0'
compile configuration: 'macosx_x86_64', group: 'com.eclipsesource.j2v8', name: 'j2v8_macosx_x86_x64', version: '4.6.0'
compile configuration: 'windows_x86_32', group: 'com.eclipsesource.j2v8', name: 'j2v8_win32_x86', version: '4.6.0'
compile configuration: 'windows_x86_64', group: 'com.eclipsesource.j2v8', name: …
Run Code Online (Sandbox Code Playgroud) 我是 Android Studio 开发的新手,也是 gradle 和 j2v8 的新手。我有一个示例 Hello World 应用程序,想在其中使用 j2v8 (只是出于好奇)。我的应用程序 gradle 中有以下内容
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
// https://mvnrepository.com/artifact/com.eclipsesource.j2v8/j2v8_android
compile group: 'com.eclipsesource.j2v8', name: 'j2v8_android', version: '3.0.5'
}
Run Code Online (Sandbox Code Playgroud)
最后一个是我尝试添加 j2v8。接下来,我尝试了这篇文章中的示例行,因此我将以下内容添加到我的活动中:
V8 v8 = V8.createV8Runtime();
Run Code Online (Sandbox Code Playgroud)
我不明白的是我需要什么进口才能发挥作用。我肯定错过了一个或多个步骤,但很难在网上找到说明。
谢谢。