搜索
查看: 1660|回复: 2

调用JAVA的一个问题请问各位高手了

[复制链接]

2

主题

4

帖子

33

积分

新手入门

Rank: 1

积分
33
发表于 2015-11-26 22:39:58 | 显示全部楼层 |阅读模式
JAVA源码中有PACKAGE语句。发现编译之后加载会报错。怎样才能正常调用呢?
JAVA示例:

  1. //filename  HelloworldApp2.java
  2. package com.cmb.b2b;   
  3. import java.io.*; //引入Java包   

  4.    
  5. public class HelloworldApp3 {   
  6.         static native String aardio(String code);
  7.          
  8.         public static String main(String[] args) {   
  9.                 System.out.println("Hello this is a simply test"); //输出字符串,字符串用引号括起来
  10.                 System.out.println( args[0]  );  
  11.                 System.out.println( args[1]  );
  12.                 return "aardio,你好,这是给你的返回值";
  13.         }  
  14.         public String name = "HelloworldApp2";
  15.         public static int static_num = 123;
  16.         public int test(int a) {   
  17.                 return a + 123;
  18.         }
  19.         public String test_aardio() {  
  20.                 return aardio("import win;win.msgbox('我是Java,我正在执行aardio代码');return true;") ;
  21.         }      
  22. }  
复制代码


使用示例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(类名,字段名,类型声明)
---------------------------
确定   
---------------------------



  1. //调用Java虚拟机入门

  2. /*
  3. 默认自带绿色精简版的JRE(版本1.6),压缩后6.8MB,可根据需要继续精简,或替换JRE版本
  4. 默认在EXE目录或工程目录下的JAVA/jre 子目录查找jre,删除自带jre将会使用系统安装的jre或jdk(向下兼容jre 1.7,1.7,1.8.....)
  5. */
  6. import java;  
  7. import console;

  8. console.open();
  9. var jvm = java(); //创建Java虚拟机

  10. /*
  11. 默认会添加 \java\以及其目录下的jar文件(不含子目录)为搜索Java类的位置
  12. 用下面的函数可以动态添加类搜索位置(目录或jar文件)
  13. */
  14. jvm.addClassLoaderUrl("~\example\Java语言\java\com\cmb\b2b");

  15. /*
  16. 自内存或文件直接加载类,注意下面的$操作符指示aardio在编译时将文件置入内存
  17. 而路径前面的波浪线~表示EXE根目录(开发时指开发环境根目录)
  18. */
  19. //HelloworldApp = jvm.defineJavaClass("HelloworldApp",$"~\example\Java语言\java\com\cmb\b2b\HelloworldApp3.class")

  20. /*
  21. 查找类对象的方法很简单
  22. */
  23. HelloworldApp = jvm.findJavaClass("HelloworldApp3")

  24. /*
  25. 查找类的静态方法,注意函数原型一定要正确匹配Java中的函数定义,
  26. 如果仅仅名字是对的,函数原型是错的一样会找不到
  27. */
  28. var jmain = jvm.getStaticClassMethod(  
  29.         HelloworldApp, //这里可以是类名,也可以是已加载的类对象
  30.         "main", //函数名
  31.         "string(string[])"//函数原型语法与API相同,不同的是可以使用[]表示数组参数
  32. );

  33. /*
  34. 调用Java函数很简单,与普通函数一样使用
  35. */
  36. var str = jmain( "测试","运行java")
  37. console.log( str )

  38. //创建java对象
  39. var jstring = jvm.newJavaObject(
  40.         "java.lang.String", //指定类名
  41.         "void(WORD[])", //指定构造函数
  42.         string.fromto("测试",0,65001) //传入构造参数
  43.         );
  44.        

  45. //创建java对象,如果是默认构造函数,即原型为 void() 可省略其他参数
  46. var helloworld = jvm.newJavaObject( "HelloworldApp" );

  47. //获取Java对象的方法
  48. test = helloworld.getMethod("test","int(int)")
  49. console.log( test(3) );//调用Java对象的方法
  50. console.pause()
复制代码
回复

使用道具 举报

3

主题

163

帖子

918

积分

荣誉会员

Rank: 8Rank: 8

积分
918
发表于 2015-11-27 00:12:19 | 显示全部楼层

java中的包类似aardio中的库, 那个"/java/"目录就类似aardio中的"/lib/"目录,只不过java可以添加更多的查找位置,例如你上面用的

java中的包类似aardio中的库,
那个"/java/"目录就类似aardio中的"/lib/"目录,只不过java可以添加更多的查找位置,例如你上面用的 jvm.addClassLoaderUrl("~\example\Java语言\java\com\cmb\b2b\");

但你这个用法其实是错误的,举个例子,你查找类
HelloworldApp = jvm.findJavaClass("com.cmb.b2b.HelloworldApp3")
那么java会把他搞成 "com\cmb\b2b\HelloworldApp3.class" 这样的路径,再去跟你预先找定的查找位置一个个的拼接,例如默认的查找位置是 "\java\",那么他就会到 "\java\com\cmb\b2b\HelloworldApp3.class" 这里去找这个类了。
所以你把生成的类放到
"\java\com\cmb\b2b\HelloworldApp3.class"  这个位置,
然后 jvm.findJavaClass("com.cmb.b2b.HelloworldApp3") 就可以了。


当然,查找类的根目录可以添加更多,
jar其实也是一个虚拟目录(只不过打包到了一个压缩包里),而"/java/" 下面的jar默认都是添加到classpath的。
所以这些包啊类的,打包成jar扔到java目录下就可以了。
回复

使用道具 举报

2

主题

4

帖子

33

积分

新手入门

Rank: 1

积分
33
 楼主| 发表于 2015-11-27 10:51:51 来自手机 | 显示全部楼层

豁然开朗了。。感谢高手。

豁然开朗了。。感谢高手。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-24 06:27 , Processed in 0.062500 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表