浏览模式: 标准 | 列表

Google 出来 Android 已经有一段时间了,昨天晚上下来玩了一下,还不错,不过找到一些 Android 上的 Java bug,其中最大的一个是 java.lang.reflect.Proxy 的 bug,它的 newProxyInstance 方法和 getProxyClass 方法,不论带入的 interfaces 是否是空,都会抛出 NullPointerException 错误,同样的调用方式在 PC 的 JDK 1.4、1.5 和 6.0 就完全正常。这个 bug 昨天提交到 Android 的讨论组了,不过他们什么时候能够修正这个 bug 就不知道了。当然,因为这个原因,PHPRPC 在开发 Android 应用程序时,暂时无法使用定义代理类接口,并通过代理类进行远程调用。但是仍然可以通过 PHPRPC_Client 对象的 invoke 方法来进行远程调用,下面是实例代码:

Java代码
  1. package com.google.android.hello;  
  2.    
  3. import org.phprpc.PHPRPC_Client;  
  4. import org.phprpc.util.Cast;  
  5.    
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.widget.TextView;  
  9.    
  10. public class HelloPHPRPC extends Activity {  
  11.     @Override  
  12.     public void onCreate(Bundle icicle) {  
  13.         super.onCreate(icicle);  
  14.         PHPRPC_Client client = new PHPRPC_Client("http://www.phprpc.org/server.php");  
  15.         client.setEncryptMode(2);  
  16. /* 
  17.         TextView tv1 = new TextView(this); 
  18.         tv1.setText(client.invoke("add", new Object[] { 1, 2 }).toString()); 
  19.         setContentView(tv1); 
  20. */  
  21.         TextView tv2 = new TextView(this);  
  22.         tv2.setText(Cast.toString(client.invoke("hello"new Object[] {"PHPRPC"})));  
  23.         setContentView(tv2);  
  24.     }  
  25. }  

下面是一个例子运行截图:

上面注释掉的语句也是可以正常执行的,注释掉是因为后面的执行会覆盖前面执行的结果。invoke 方式进行远程调用,只有一点需要注意,就是返回结果如果是字符串,那么需要用 Cast.toString 转化为字符串,因为字符串默认反序列化为字节数组,如果是其它类型,需要用 Cast.cast 方法来转成相应的类型,否则可能跟你预期的类型可能不一致,因为默认会返回最接近返回值的相容类型。

有了上面的例子和讲解,我想大家用 PHPRPC 来开发 Android 应用程序就没有什么问题了!

» 阅读全文

做 Java 程序,在封装一些程序库的时候,通常都是打包成 jar 文件的。如果跟随 class 文件一起打包的除了 class 文件还有其它资源文件的话,我们该如何在我们一起打包的程序中读取它们呢?这里给出一种方法:

final public class ResourceLoader {
    
public static byte[] getResource(String path) {
        
JarFile jarFile = new JarFile(URLDecoder.decode(ResourceLoader.class.getProtectionDomain().getCodeSource().getLocation().getFile()));
        
JarEntry entry = jarFile.getJarEntry(path);
        
byte[] data = new byte[(int)entry.getSize()];
        
BufferedInputStream in = new BufferedInputStream(jarFile.getInputStream(entry));
        
in.read(data);
        
in.close();
        
return data;
    
}
}

这样直接用 ResourceLoader.getResource(”data/data.dat”) 就可以读取 jar 文件中 data 目录下的 data.dat 文件了。这里静态方法 getResource 的 path 参数是相对于 Jar 文件来说的相对路径。

» 阅读全文

前两天发布的几个 ROM 已经移除了 577W 自带的 JMM,这里提供一个 QVGA 绿色卡版的 Java 模拟器 JMM,直接放到卡上,运行一下 jmm.exe,然后就可以用了。 下载:JMM.zip

» 阅读全文

这个 Java 客户端版本在 J2SE SDK 1.3.1 和更高版本下编译通过,更低版本的 JDK 没有找到,所以没有测试能不能用。这个客户端不仅可以用在 JSP 中,在任何 J2SE 程序中都可以使用。该客户端实现的是同步调用,支持设置代理服务器,支持引用参数传递,服务器端输出重定向,加密传输等功能。调用远程方法使用 invoke 方法,第一个参数为远程过程名,第二个参数为远程过程的参数的数组。第三个参数表示是否是引用传递(可选,默认为非引用传递)。

» 阅读全文

经过半个月的努力,PHPRPC 的 J2EE 服务器实现终于完成了。这个版本提供了 PHPRPC 协议的完整实现,与 .NET 版本的 PHPRPC 服务器实现的功能基本相同,包括支持不同类或不同对象中同名方法的重载,不过由于 Java 本身的缺陷,对引用参数传递的支持很有限。该实现使用了 PHPSerializer.java、XXTEA.java 和 Base64.java 这三个辅助程序。编译时需要包含它们。该版本将在近期将要发布的 PHPRPC 中包含。 该程序在 J2SE SDK 1.3.1 和更高版本上编译通过,更低版本的未做测试。

» 阅读全文