3

在阅读了无数关于如何使引用的库与 Android-Eclipse 一起工作的帖子后,我必须声明无法运行提供的示例井字游戏,该示例井字游戏分为两个项目TicTacToeLib(标记为库)和TicTacToeMain(使用 TicTacToeLib )

  1. 我首先将创建的 TicTacToeLib导入Eclipse(文件->新建->其他->Android->Android 示例项目->TicTacToeLib)
  2. 然后将创建的 TicTacToeMain导入Eclipse (File->New->Other->Android->Android sample project->TicTacToeMain)
  3. 按照Android 开发者网站上关于如何设置和引用库项目的说明进行操作

在这里我遇到了第一个障碍,因为一方面该站点提到<user-library>应该使用,但TicTacToeMain的示例清单不包含任何<uses-library>元素。
无论哪种方式,示例都不会运行。

没有<user-library>元素,项目甚至无法编译:

在此处输入图像描述

如果我手动将 tictactoelib.jar 添加到构建路径 ( Add JARs...),这不是Android 开发人员页面中指示步骤的一部分,错误就会消失,只有警告仍然存在。运行应用程序退出失败(“不幸的是井字游戏示例已停止”):

04-08 16:05:24.762: E/dalvikvm(3741): Could not find class 'com.example.android.tictactoe.library.GameActivity', referenced from method com.example.android.tictactoe.MainActivity.startGame
04-08 16:05:24.762: W/dalvikvm(3741): VFY: unable to resolve const-class 17 (Lcom/example/android/tictactoe/library/GameActivity;) in Lcom/example/android/tictactoe/MainActivity;
04-08 16:05:24.767: D/dalvikvm(3741): VFY: replacing opcode 0x1c at 0x0002
04-08 16:05:24.877: V/PhoneStatusBar(166): setLightsOn(true)
04-08 16:05:24.937: D/gralloc_goldfish(3741): Emulator without GPU emulation detected.
04-08 16:05:25.017: I/Process(89): Sending signal. PID: 3741 SIG: 3
04-08 16:05:25.027: I/dalvikvm(3741): threadid=3: reacting to signal 3
04-08 16:05:25.037: I/dalvikvm(3741): Wrote stack traces to '/data/anr/traces.txt'
04-08 16:05:25.058: I/ActivityManager(89): Displayed com.example.android.tictactoe/.MainActivity: +1s368ms
04-08 16:05:25.317: W/NetworkManagementSocketTagger(89): setKernelCountSet(10013, 0) failed with errno -2
04-08 16:05:27.857: D/AndroidRuntime(3741): Shutting down VM
04-08 16:05:27.857: W/dalvikvm(3741): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
04-08 16:05:27.918: E/AndroidRuntime(3741): FATAL EXCEPTION: main
04-08 16:05:27.918: E/AndroidRuntime(3741): java.lang.NoClassDefFoundError: com.example.android.tictactoe.library.GameActivity
04-08 16:05:27.918: E/AndroidRuntime(3741):     at com.example.android.tictactoe.MainActivity.startGame(MainActivity.java:51)
04-08 16:05:27.918: E/AndroidRuntime(3741):     at com.example.android.tictactoe.MainActivity.access$0(MainActivity.java:50)
04-08 16:05:27.918: E/AndroidRuntime(3741):     at com.example.android.tictactoe.MainActivity$1.onClick(MainActivity.java:38)
04-08 16:05:27.918: E/AndroidRuntime(3741):     at android.view.View.performClick(View.java:3511)
04-08 16:05:27.918: E/AndroidRuntime(3741):     at android.view.View$PerformClick.run(View.java:14105)

将以下行添加到 TicTacToeMain 清单:

<uses-library android:name="com.example.android.tictactoe.library"/>

甚至不启动应用程序:

[2013-04-08 19:13:03 - TicTacToeMain] Android Launch!
[2013-04-08 19:13:03 - TicTacToeMain] adb is running normally.
[2013-04-08 19:13:03 - TicTacToeMain] Performing com.example.android.tictactoe.MainActivity activity launch
[2013-04-08 19:13:03 - TicTacToeMain] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'Smartphone_ics'
[2013-04-08 19:13:03 - TicTacToeMain] Uploading TicTacToeMain.apk onto device 'emulator-5554'
[2013-04-08 19:13:03 - TicTacToeMain] Installing TicTacToeMain.apk...
[2013-04-08 19:13:06 - TicTacToeMain] Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
[2013-04-08 19:13:06 - TicTacToeMain] Please check logcat output for more details.
[2013-04-08 19:13:06 - TicTacToeMain] Launch canceled!

我尝试了其他的东西,没有解决问题:

  • 将目标井字游戏主版本改为 15,改为 10
  • 在构建路径中添加 TicTacToeLib 作为用户库
  • 为TicTacToeMain创建了一个libs文件夹,并复制了tictactoelib.jar,没有解决,使用Import...导入了tictactoelib.jar,没有加糖

我希望这个示例工作的原因,除了了解引用库的机制如何工作之外,我想创建一个复杂的应用程序,使用许多引用库,如果我不能让这个愚蠢的示例工作,那么我将无法到。

还有一点,将参考库项目添加到 TicTacToeMain:

在此处输入图像描述

它不粘,我按Apply指示按,然后OK。但是当我再次打开项目的属性时(不运行,不编译,只是重新打开):

在此处输入图像描述

也许这是真正的症状,但我不知道还能尝试什么。我使用 Eclipse 4.2.1,Android SDK 21.1,Java IDE 1.5.1
目标 Java 合规级别是 1.6
我尝试了几个 AVD 模拟器,都显示同样的问题。

4

3 回答 3

0

就是做一个new-project-android->Android Sample Project->Tictactoemain/lib。不要导入,只是一个新项目,它可以工作。在任何情况下,右键单击项目名称 -> Android 工具 -> 修复项目属性,然后在菜单项目 -> 清理中。也许是另一个干净的工作区或新的模拟器设备(是否正确设置?)?你有java、android sdk、adt等吗?我没有这样的问题。

于 2013-04-08T17:15:39.397 回答
0

关于参考图书馆

此错误意味着您TicTacToLib正在使用另一个项目,要解决此错误,您必须:

  • 复制tictactolib.

  • 删除正在使用的项目tictactolib并检查remove from the hard disk.

  • 过去的tictactolib旧路。

再试一次,错误就会消失。

笔记:

ofc,您可以直接从正在使用它的项目中取消导入库,而无需删除该项目。

于 2013-04-08T17:40:43.927 回答
0

这个 voodoo 过程最终使项目能够正常编译和运行。
我仍然不知道是什么造成了差异,所以如果您理解,请编辑此答案并完成说明。

过程
经过多次不成功的尝试,我决定从 TicTacToeLib 项目中导出 JAR 文件,并将导出的 JAR 添加到 TicTacToeMain 项目中。这样做解决了 ClassNotFound 异常,但产生了一个新问题:重复的资源 ID(参见这篇文章)。
因此,我从 libs 目录和构建路径中删除了导入的 JAR,只是出于绝望,我去了 TicTacToeMain propeties->Android 并添加了 TicTacToeLib 作为参考。我之前至少做过 4 次,但没有成功。我不知道为什么我又试了一次。
这一次,我注意到在我的视野边缘,Eclipse 的 Package Explorer 窗格中发生了一些变化。我发现在 TicTactToeMain/gen 下添加了一些东西。一个 com.example.tictactoe.library 文件夹,其中包含一个 R.java 文件,其重新编号的 ID 与主项目的 ID 不冲突。在我尝试添加参考库的其他尝试中,这从未发生过。所以我运行了这个应用程序,这次它运行正常。
正如我所说,在这一点上,这对我来说是巫术,我不知道我现在所做的与前 4 次尝试相同的不同。

于 2013-04-10T06:45:41.030 回答