我正在创建一个可以过滤照片的Android应用。为了执行这些过滤器所需的图像处理,我使用ImageJ的API。用户在对话框中选择要应用于照片集的过滤器。按“OK”后,应用程序崩溃,LogCat中出现以下输出(我正在使用Eclipse):
04-07 15:09:24.094: E/AndroidRuntime(14901): FATAL EXCEPTION: main
04-07 15:09:24.094: E/AndroidRuntime(14901): Process: edu.wpi.khufnagle.lighthousenavigator, PID: 14901
04-07 15:09:24.094: E/AndroidRuntime(14901): java.lang.NoClassDefFoundError: ij.io.Opener
04-07 15:09:24.094: E/AndroidRuntime(14901): at edu.wpi.khufnagle.lighthousenavigator.filter.ImageManipulator.validateOriginalImage(ImageManipulator.java:38)
04-07 15:09:24.094: E/AndroidRuntime(14901): at edu.wpi.khufnagle.lighthousenavigator.filter.LighthousePresenceFilter.<init>(LighthousePresenceFilter.java:120)
04-07 15:09:24.094: E/AndroidRuntime(14901): at edu.wpi.khufnagle.lighthousenavigator.filter.PhotographFilter.filterPhotos(PhotographFilter.java:137)
04-07 15:09:24.094: E/AndroidRuntime(14901): at edu.wpi.khufnagle.lighthousenavigator.PhotographsActivity$5.onClick(PhotographsActivity.java:623)
04-07 15:09:24.094: E/AndroidRuntime(14901): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
04-07 15:09:24.094: E/AndroidRuntime(14901): at android.os.Handler.dispatchMessage(Handler.java:102)
正如您可能猜到的那样,validateOriginalImage()
方法中的相关行会从ImageJ创建一个新的Opener
对象(用于在下一行中将图像作为ImagePlus
对象打开后期处理)。
当我将“ij.jar”作为外部JAR文件添加到我的应用程序的构建路径时(在Eclipse的“配置构建路径”对话框的“库”选项卡上)或时,会发生此异常我将整个ImageJ源代码作为单独的Java项目包含在应用程序构建路径的工作区中(在“项目”选项卡上)。我使用的是“ij.jar”文件版本1.48或源代码版本1.47v(从不同时使用,因为这显然会在构建过程中引起一些冲突)。
为了解决这个问题,我在应用程序项目本身的“src”目录中包含了ImageJ源代码(如上所述1.47v),当我尝试选择某些内容时,我收到了一个不同但同样致命的异常在应用程序中的过滤对话框中:
04-07 15:11:07.530: E/AndroidRuntime(29709): FATAL EXCEPTION: main
04-07 15:11:07.530: E/AndroidRuntime(29709): Process: edu.wpi.khufnagle.lighthousenavigator, PID: 29709
04-07 15:11:07.530: E/AndroidRuntime(29709): java.lang.ExceptionInInitializerError
04-07 15:11:07.530: E/AndroidRuntime(29709): at ij.Menus.<clinit>(Menus.java:80)
04-07 15:11:07.530: E/AndroidRuntime(29709): at ij.io.Opener.<clinit>(Opener.java:51)
04-07 15:11:07.530: E/AndroidRuntime(29709): at edu.wpi.khufnagle.lighthousenavigator.filter.ImageManipulator.validateOriginalImage(ImageManipulator.java:38)
.
.
.
04-07 15:11:07.530: E/AndroidRuntime(29709): Caused by: java.lang.StringIndexOutOfBoundsException: length=1; regionStart=0; regionLength=3
04-07 15:11:07.530: E/AndroidRuntime(29709): at java.lang.String.startEndAndLength(String.java:588)
04-07 15:11:07.530: E/AndroidRuntime(29709): at java.lang.String.substring(String.java:1475)
04-07 15:11:07.530: E/AndroidRuntime(29709): at ij.IJ.<clinit>(IJ.java:65)
04-07 15:11:07.530: E/AndroidRuntime(29709): ... 15 more
在StringIndexOutOfBoundsException
的一行代码中发生IJ.java
,检查我正在运行的Java版本。显然,ImageJ认为这个版本字符串是空白的,当它试图获取这个(看似)空字符串的子字符串时,代码会抛出异常。
是否有任何ImageJ / Eclipse大师可以帮助成功将ImageJ集成到我的应用程序中?
答案 0 :(得分:1)
请注意,在java中,您可以获得如下的java版本:
System.getProperty(“java.version”)
http://deviltechie.wordpress.com/2011/03/16/get-the-version-of-java-runtime/
但在Android中它有点不同:
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
version = pInfo.versionName;
Get application version programmatically in android
这可以解释NoClassDefFoundError
。