|
JAVA源码中有PACKAGE语句。发现编译之后加载会报错。怎样才能正常调用呢?
JAVA示例:
- //filename HelloworldApp2.java
- package com.cmb.b2b;
- import java.io.*; //引入Java包
-
- public class HelloworldApp3 {
- static native String aardio(String code);
-
- public static String main(String[] args) {
- System.out.println("Hello this is a simply test"); //输出字符串,字符串用引号括起来
- System.out.println( args[0] );
- System.out.println( args[1] );
- return "aardio,你好,这是给你的返回值";
- }
- public String name = "HelloworldApp2";
- public static int static_num = 123;
- public int test(int a) {
- return a + 123;
- }
- public String test_aardio() {
- return aardio("import win;win.msgbox('我是Java,我正在执行aardio代码');return true;") ;
- }
- }
复制代码
使用示例run.aardio,运行会报错,另外说明下java目录存在HelloworldApp3.class,同时我在java文件夹中建了java\com\cmb\b2b这个路径的文件夹。b2b文件夹里也放了HelloworldApp3.class。但是运行还是会报错。报错提示:
控制台报错:
java.lang.NoClassDefFoundError: HelloworldApp3 (wrong name: com/cmb/b2b/Hellowor
ldApp3)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
界面报错:
---------------------------
aardio:运行时错误
---------------------------
必须指定参数 getClassMethod(类名,字段名,类型声明)
---------------------------
确定
---------------------------
- //调用Java虚拟机入门
- /*
- 默认自带绿色精简版的JRE(版本1.6),压缩后6.8MB,可根据需要继续精简,或替换JRE版本
- 默认在EXE目录或工程目录下的JAVA/jre 子目录查找jre,删除自带jre将会使用系统安装的jre或jdk(向下兼容jre 1.7,1.7,1.8.....)
- */
- import java;
- import console;
- console.open();
- var jvm = java(); //创建Java虚拟机
- /*
- 默认会添加 \java\以及其目录下的jar文件(不含子目录)为搜索Java类的位置
- 用下面的函数可以动态添加类搜索位置(目录或jar文件)
- */
- jvm.addClassLoaderUrl("~\example\Java语言\java\com\cmb\b2b");
- /*
- 自内存或文件直接加载类,注意下面的$操作符指示aardio在编译时将文件置入内存
- 而路径前面的波浪线~表示EXE根目录(开发时指开发环境根目录)
- */
- //HelloworldApp = jvm.defineJavaClass("HelloworldApp",$"~\example\Java语言\java\com\cmb\b2b\HelloworldApp3.class")
- /*
- 查找类对象的方法很简单
- */
- HelloworldApp = jvm.findJavaClass("HelloworldApp3")
- /*
- 查找类的静态方法,注意函数原型一定要正确匹配Java中的函数定义,
- 如果仅仅名字是对的,函数原型是错的一样会找不到
- */
- var jmain = jvm.getStaticClassMethod(
- HelloworldApp, //这里可以是类名,也可以是已加载的类对象
- "main", //函数名
- "string(string[])"//函数原型语法与API相同,不同的是可以使用[]表示数组参数
- );
-
- /*
- 调用Java函数很简单,与普通函数一样使用
- */
- var str = jmain( "测试","运行java")
- console.log( str )
- //创建java对象
- var jstring = jvm.newJavaObject(
- "java.lang.String", //指定类名
- "void(WORD[])", //指定构造函数
- string.fromto("测试",0,65001) //传入构造参数
- );
-
-
- //创建java对象,如果是默认构造函数,即原型为 void() 可省略其他参数
- var helloworld = jvm.newJavaObject( "HelloworldApp" );
- //获取Java对象的方法
- test = helloworld.getMethod("test","int(int)")
- console.log( test(3) );//调用Java对象的方法
- console.pause()
复制代码 |
|