• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

php调用java类文件

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

      最近在折腾php调用java类,网上查阅资料,最终选用JavaBridge,遇到的第一个问题是java_require() 函数引入自定义java打包而成的jar文件,在新版本的JavaBridge中,该函数已被废弃,使用会出错。

网上搜索的资料,大致有两种方法,亲测可行;

方法一

      从http://php-java-bridge.sourceforge.net/pjb/index.php下载php-java-bridge_6.2.1的war包,将其中的将war包放在tomcat的应用程序目录webapps下,启动tomcat,会自动解析出一个同名的文件夹,其中的JavaBridge.jar和Java.inc是需要用到的。

      在程序中,一定要记得引入该Java.inc文件,格式是require_once(“http://localhost:8080/JavaBridge/java/Java.inc”);注意,由于此时Tomcat已经运行,因而可以使用HTTP的方式请求,但是默认情况下php是不支持来自非本地服务器的链接,所以需要修改php.ini文件,设置这两个值处于开启状态:

1 allow_url_fopen = On
2 allow_url_include = On(这个属性可能要添加)

      一般的测试例子都会类似这样:

 1 <?php
 2 require_once("http://localhost:8080/JavaBridge/java/Java.inc");
 3 $system  =  new  Java( \'java.lang.System\' );
 4 java_set_file_encoding("UTF-8");   //设置编码格式,避免出现乱码
 5 print  \'Java version=\' . $system ->getProperty( \'java.version\' ). \' <br>\' ;  
 6 print  \'Java vendor=\'  . $system ->getProperty( \'java.vendor\' ). \' <br>\' ;  
 7 print  \'OS=\' . $system ->getProperty( \'os.name\' ). \' \' .  
 8 $system ->getProperty( \'os.version\' ). \' on \' .  
 9 $system ->getProperty( \'os.arch\' ). \' <br>\' ;  
10 $te = $system->getProperties();
11  echo $te;
12 ?>

      该例子如果运行成功会输出java的版本号以及一系列系统常量,这说明至少php调用java预定义的系统类以及没有问题了,结果会类似这样(截图只是截取了一部分):

 

      要调用自定义的类,比如Test类,其源代码为:

 1 public class Test
 2 {
 3     private String name = "";
 4 
 5     //setter and getter
 6     public void setName(String name)
 7     {
 8         this.name = name;
 9     }
10 
11     public String getName()
12     {
13         return this.name;
14     }
15 
16     //加法
17     public float add(float num1, float num2)
18     {
19         return num1 + num2;
20     }
21 }

      需要使用打包命令,将编译好的Test.class文件打包成Test.jar文件,放在java安装目录F:\javaSetup\jre8\lib\ext下发,JavaBridge.jar文件不需要同时放入,原因可能是在Java.inc中有引用关系,在程序中通过java函数创建类的实例$test=new Java(‘Test’);,之后就可以像java一样调用其中的方法了,如下:

1 $test=new Java("Test");
2 $test->setName("哈哈,PHP调用JAVA的方法!");
3 echo "调用类Test的getName方法,返回值为:".$test->getName()."<br>";
4 echo "调用Test的add方法,返回值为:".$test->add(11.2, 15.7)."<br>";

方法二

      第二种方法不需要整个war包,只需要其中的JavaBridge.jar和Java.inc,首先仍然需要引入Java.inc文件,理论上放在哪里都可以,只要路径正确。然后在命令行切换到JavaBridge.jar的路径,通过start javaw -jar JavaBridge.jar运行该jar包,此时会弹出一个选择框,一般选择默认的就可以(需要注意端口问题,避免被占用),运行以下代码,一般是没问题的:

 1 <?php
 2 require_once("java/Java.inc");//引入java.inc文件 3 $system  =  new  Java( \'java.lang.System\' );
 4 java_set_file_encoding("UTF-8");   //设置编码格式,避免出现乱码
 5 print  \'Java version=\' . $system ->getProperty( \'java.version\' ). \' <br>\' ;  
 6 print  \'Java vendor=\'  . $system ->getProperty( \'java.vendor\' ). \' <br>\' ;  
 7 print  \'OS=\' . $system ->getProperty( \'os.name\' ). \' \' .  
 8 $system ->getProperty( \'os.version\' ). \' on \' .  
 9 $system ->getProperty( \'os.arch\' ). \' <br>\' ;  
10 $te = $system->getProperties();
11  echo $te;
12 ?>

若成功,说明此时调用java系统类是可以的。

要调用自定义的java类,仍然以前面的Test.java为例,将其打包成Test.jar,放入F:\javaSetup\jre8\lib\ext(java安装目录)下,若JavaBridge.jar已经开始运行,需要重新启动,然后像下面这样调用即可:

1 $test=new Java("Test");
2 $test->setName("哈哈,PHP调用JAVA的方法!");
3 echo "调用类Test的getName方法,返回值为:".$test->getName()."<br>";
4 echo "调用Test的add方法,返回值为:".$test->add(11.2, 15.7)."<br>";

      这里有一个现象需要注意,在调用java系统类输出系统变量时,第一种方法的输出明显比第二种方法多很多。

      可能的问题:

      1.单文件jar包的引用或许不会有大问题,然而如果需要许多自定义的jar可能会出问题

      2.在不启动tomcat的情况下,是否依然可以呢???

      实验证明,在第一种方式的情况下,这样是不可以的,会出现如下错误,该错误与第二种方式不启用JavaBridge.jar的错误是一样的,这说明运行tomcat的时候,会附带运行该jar文件。 

      不过在引入Java.inc文件时,该inc文件可以不用放在tomcat的webapps下,理论上该文件放在任何地方都可以:即

      require_once("http://localhost:8080/JavaBridge/java/Java.inc");和require_once("java/Java.inc");是等价的。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php调用java发布时间:2022-07-10
下一篇:
Php调用Java的方法 - youxin发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap