【问题标题】:Executing SAME program on both Android and JVM using different libraries使用不同的库在 Android 和 JVM 上执行相同的程序
【发布时间】:2014-08-11 19:35:39
【问题描述】:

我的代码需要在 linux 机器和 Android 手机之间迁移。它进行基本的图像处理,并使用 Linux 上的 ImageIO 和 Android 上的 BitmapFactory 来加载 jpeg 图像。所以,我检测环境并调用如下适当的方法:

   if (isDalvik()) {
      Bitmap bi = BitmapFactory.decodeStream(this.getClass().getResourceAsStream("test.jpg"));                                                                                        
      this.findFaces_Android(bi, 1, 40, new File("result.jpg"));
   } else {
     BufferedImage bi = ImageIO.read(Exp_Starter.class.getResourceAsStream("test.jpg"));
     this.findFaces_J2SE(bi, 1, 40, new File("result.jpg"));
   }

这在 Linux 上运行良好,因为我已将 android.jar 放在类路径中。但是,它无法在 Android 上运行。启动时,它声称找不到 BufferedImage 和 ImageIO 类,尽管它们实际上从未被调用,因为 else 语句将不会被执行。

我尝试为 Android 应用程序创建空类 java.awt.image.BufferedImage 和 javax.imageio.ImageIO,但编译器不允许覆盖它们。

您知道如何解决这个问题并让 SAME 程序在两种不同的环境中运行吗?

【问题讨论】:

  • 您不需要像在 Linux 上那样将这些 jars 添加到类路径中吗?
  • 尝试将 else 部分移到单独的方法中。
  • 代码先编译错误,然后执行。在编译时,它不检查 if-else,它只转换语句。所以即使它不需要执行 bufferedImage 和 ImageIO,它仍然需要类。因此你得到一个错误。
  • @AdmiralAdama 这些 jar 是标准 Java 库,因此不能在类路径中指定。事实上,如果您尝试将其中之一覆盖为类路径,编译器将退出。
  • @HansKratz 将它们移至单独的方法并没有帮助。但这给了我将它们放在单独的类中并根据运行环境实例化这些类的想法。这实际上奏效了。感谢您的想法

标签: java android cross-platform


【解决方案1】:

显然,将不同运行时环境的代码移动到不同的类可以解决问题。这对我有用:

if (isDalvik()) {
  Find_Faces_Android ff = new Find_Faces_Android();   
  ff.readImage(this.getClass().getResourceAsStream("test.jpg"));
  int no_detected_faces = ff.findFaces( 1, 40, new File("result.jpg"));
} else {
  Find_Faces_JVM ff = new Find_Faces_JVM();
  ff.readImage(this.getClass().getResourceAsStream("test.jpg"));
  int no_detected_faces = ff.findFaces( 1, 40, new File("result.jpg"));
}

【讨论】:

    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多