【发布时间】:2015-12-03 07:46:27
【问题描述】:
我正在尝试在需要在/tmp 上具有noexec 的盒子上运行android sdk。
我可以将 java tmp 指向另一个我可以执行的地方,但这会破坏警察在 tmp 中需要noexec 的目的。所以我现在还不想这样做。
我想正确安装 sdk 所需的库,但我的 java 生锈了。
当我尝试运行它时,我得到:
$ Android/Sdk/tools/android
Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-gtk-3550 or swt-gtk in swt.library.path, java.library.path or the jar file
at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
at org.eclipse.swt.internal.C.<clinit>(Unknown Source)
at org.eclipse.swt.internal.Converter.wcsToMbcs(Unknown Source)
at org.eclipse.swt.internal.Converter.wcsToMbcs(Unknown Source)
at org.eclipse.swt.widgets.Display.<clinit>(Unknown Source)
at com.android.sdkmanager.Main.showSdkManagerWindow(Main.java:403)
at com.android.sdkmanager.Main.doAction(Main.java:391)
at com.android.sdkmanager.Main.run(Main.java:151)
at com.android.sdkmanager.Main.main(Main.java:117)
我第一次尝试解决这个问题是:
$ sudo aptitude install libswt-gtk-3-java...
Selecting previously unselected package libswt-gtk-3-jni.
(Reading database ... 199270 files and directories currently installed.)
Preparing to unpack .../libswt-gtk-3-jni_3.8.2-3_amd64.deb ...
Unpacking libswt-gtk-3-jni (3.8.2-3) ...
Selecting previously unselected package libswt-gtk-3-java.
Preparing to unpack .../libswt-gtk-3-java_3.8.2-3_amd64.deb ...
Unpacking libswt-gtk-3-java (3.8.2-3) ...
Setting up libswt-gtk-3-jni (3.8.2-3) ...
Setting up libswt-gtk-3-java (3.8.2-3) ...
但我仍然遇到同样的错误。这是否意味着该程序不是在寻找默认库,而是故意尝试使用它在 /tmp 上解压缩的东西?或者java会一直在/tmp中解压一个jar,然后尝试从那里运行它,我无能为力吗?
编辑:
明确noexec 是原因。如果我使用-Djava.io.tmpdir=Android/tmp 运行应用程序,那么一切正常。我在新的 tmp 目录中有以下内容:
Android/tmp/
└── swtlib-64
├── libswt-gtk-3550.so
└── libswt-pi-gtk-3550.so
编辑 2:
$ ANDROID_SWT=/usr/lib/java/
$ ls $ANDROID_SWT/
swt-gtk-3.8.2.jar
$ Android/Sdk/tools/android
Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-gtk-3550 or swt-gtk in swt.library.path, java.library.path or the jar file
...same...
【问题讨论】:
-
是什么让您想到
/tmp参与其中? -
@Siguza 这就是该错误的原因。如果我追踪它,那就是它找到我的地方。我可以通过删除
noexec或设置java.io.tmpdir=/home/me/tmp来成功解决该错误 -
这是以前的:stackoverflow.com/questions/3344903/…,尽管 Android SDK 将 SWT 库复制到
/tmp的实际原因仍然是个谜。 -
@dhke 是的,那是在询问原因并解决问题(我在问题本身上提到了两个解决方案,最后一个与那里接受的答案几乎相同)。这个问题不一样。我选择该应用程序只是作为一个更大问题的示例。
-
设置
ANDROID_SWT=/usr/lib(或系统libswt所在的任何位置)有帮助吗? extract lib from jar to filesystem 是SWT feature,但通常该库最终位于用户家中。另请注意第 302 行的注释,这让我感到困惑,因为 tmp 在哪里?