aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/GdbServerTask.java118
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/Messages.java62
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java311
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchConfigTabGroups.java39
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchDelegate.java506
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchShortcut.java127
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkLaunchConstants.java44
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkMainLaunchConfigTab.java61
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/messages.properties32
9 files changed, 0 insertions, 1300 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/GdbServerTask.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/GdbServerTask.java
deleted file mode 100644
index 23486ee6f..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/GdbServerTask.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.eclipse.org/org/documents/epl-v10.php
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.eclipse.ndk.internal.launch;
-
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.IShellOutputReceiver;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * The {@link GdbServerTask} launches gdbserver on the given device and attaches it to
- * provided pid.
- */
-public class GdbServerTask implements Runnable {
- private IDevice mDevice;
- private String mRunAs;
- private String mSocket;
- private int mPid;
- private CountDownLatch mAttachLatch;
-
- private GdbServerOutputReceiver mOutputReceiver;
- private Exception mLaunchException;
-
- private AtomicBoolean mCancelled = new AtomicBoolean(false);
- private AtomicBoolean mHasCompleted = new AtomicBoolean(false);
-
- /**
- * Construct a gdbserver task.
- * @param device device to run gdbserver on
- * @param runAsPackage name of the package in which gdbserver resides
- * @param socketName name of the local socket on which the server will listen
- * @param pid pid of task to attach to
- * @param attachLatch latch to notify when gdbserver gets attached to the task
- */
- public GdbServerTask(IDevice device, String runAsPackage, String socketName, int pid,
- CountDownLatch attachLatch) {
- mDevice = device;
- mRunAs = runAsPackage;
- mSocket = socketName;
- mPid = pid;
- mAttachLatch = attachLatch;
-
- mOutputReceiver = new GdbServerOutputReceiver();
- }
-
- /**
- * Runs gdbserver on the device and connects to the given task. If gdbserver manages to
- * successfully attach itself to the process, then it counts down on its attach latch.
- */
- @Override
- public void run() {
- // Launch gdbserver on the device.
- String command = String.format("run-as %s lib/gdbserver +%s --attach %d",
- mRunAs, mSocket, mPid);
- try {
- mDevice.executeShellCommand(command, mOutputReceiver, 0);
- } catch (Exception e) {
- mLaunchException = e;
- }
- }
-
- /** Returns any exceptions that might have occurred while launching gdbserver. */
- public Exception getLaunchException() {
- return mLaunchException;
- }
-
- /** Cancel gdbserver if it is running. */
- public void setCancelled() {
- mCancelled.set(true);
- }
-
- public String getShellOutput() {
- return mOutputReceiver.getOutput();
- }
-
- private class GdbServerOutputReceiver implements IShellOutputReceiver {
- private StringBuffer mOutput = new StringBuffer(100);
-
- @Override
- public synchronized void addOutput(byte[] data, int offset, int length) {
- mOutput.append(new String(data, offset, length));
-
- // notify other threads that gdbserver has attached to the task
- if (mOutput.toString().contains("Attached")) {
- mAttachLatch.countDown();
- }
- }
-
- @Override
- public void flush() {
- mHasCompleted.set(true);
- }
-
- @Override
- public boolean isCancelled() {
- return mCancelled.get();
- }
-
- public synchronized String getOutput() {
- return mOutput.toString();
- }
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/Messages.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/Messages.java
deleted file mode 100644
index 10f68e48e..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/Messages.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.eclipse.org/org/documents/epl-v10.php
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.eclipse.ndk.internal.launch;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
- private static final String BUNDLE_NAME = "com.android.ide.eclipse.ndk.internal.launch.messages"; //$NON-NLS-1$
- public static String NdkGdbLaunchDelegate_LaunchError_gdbserverOutput;
- public static String NdkGdbLaunchDelegate_Action_ActivityLaunch;
- public static String NdkGdbLaunchDelegate_Action_CheckAndroidDeviceVersion;
- public static String NdkGdbLaunchDelegate_Action_KillExistingGdbServer;
- public static String NdkGdbLaunchDelegate_Action_LaunchHostGdb;
- public static String NdkGdbLaunchDelegate_Action_LaunchingGdbServer;
- public static String NdkGdbLaunchDelegate_Action_ObtainAppAbis;
- public static String NdkGdbLaunchDelegate_Action_ObtainDevice;
- public static String NdkGdbLaunchDelegate_Action_ObtainDeviceABI;
- public static String NdkGdbLaunchDelegate_Action_PerformIncrementalBuild;
- public static String NdkGdbLaunchDelegate_Action_SettingUpPortForward;
- public static String NdkGdbLaunchDelegate_Action_SyncAppToDevice;
- public static String NdkGdbLaunchDelegate_Action_WaitGdbServerAttach;
- public static String NdkGdbLaunchDelegate_Action_WaitingForActivity;
- public static String NdkGdbLaunchDelegate_LaunchError_ActivityLaunchError;
- public static String NdkGdbLaunchDelegate_LaunchError_Api8Needed;
- public static String NdkGdbLaunchDelegate_LaunchError_CouldNotGetProject;
- public static String NdkGdbLaunchDelegate_LaunchError_gdbserverLaunchException;
- public static String NdkGdbLaunchDelegate_LaunchError_InstallError;
- public static String NdkGdbLaunchDelegate_LaunchError_InterruptedWaitingForGdbserver;
- public static String NdkGdbLaunchDelegate_LaunchError_NoActivityInManifest;
- public static String NdkGdbLaunchDelegate_LaunchError_NoCompatibleAbi;
- public static String NdkGdbLaunchDelegate_LaunchError_NoLauncherActivity;
- public static String NdkGdbLaunchDelegate_LaunchError_NoSuchActivity;
- public static String NdkGdbLaunchDelegate_LaunchError_NullApk;
- public static String NdkGdbLaunchDelegate_LaunchError_ObtainingAppFolder;
- public static String NdkGdbLaunchDelegate_LaunchError_PortForwarding;
- public static String NdkGdbLaunchDelegate_LaunchError_ProjectHasErrors;
- public static String NdkGdbLaunchDelegate_LaunchError_PullFileError;
- public static String NdkGdbLaunchDelegate_LaunchError_UnableToDetectAppAbi;
- public static String NdkGdbLaunchDelegate_LaunchError_UnknownAndroidDeviceVersion;
- public static String NdkGdbLaunchDelegate_LaunchError_VerifyIfDebugBuild;
- static {
- // initialize resource bundle
- NLS.initializeMessages(BUNDLE_NAME, Messages.class);
- }
-
- private Messages() {
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java
deleted file mode 100644
index 64e7dd80d..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.eclipse.org/org/documents/epl-v10.php
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.eclipse.ndk.internal.launch;
-
-import com.android.ide.eclipse.ndk.internal.NdkHelper;
-import com.android.ide.eclipse.ndk.internal.NdkManager;
-
-import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class NdkDebuggerTab extends AbstractLaunchConfigurationTab {
- private static String sLastGdbPath;
- private static String sLastSolibPath;
-
- private Text mGdbPathText;
- private Text mGdbInitPathText;
- private Text mGdbRemotePortText;
-
- private org.eclipse.swt.widgets.List mSoliblist;
- private Button mAddSolibButton;
- private Button mDeleteSolibButton;
-
- /**
- * @wbp.parser.entryPoint (Window Builder Entry Point)
- */
- @Override
- public void createControl(Composite parent) {
- Composite comp = new Composite(parent, SWT.NONE);
- setControl(comp);
- comp.setLayout(new GridLayout(1, false));
-
- Group grpGdb = new Group(comp, SWT.NONE);
- grpGdb.setText("Launch Options");
- grpGdb.setLayout(new GridLayout(3, false));
- grpGdb.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
- Label lblDebugger = new Label(grpGdb, SWT.NONE);
- lblDebugger.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
- lblDebugger.setText("Debugger:");
-
- mGdbPathText = new Text(grpGdb, SWT.BORDER);
- mGdbPathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
- final Button btnBrowseGdb = new Button(grpGdb, SWT.NONE);
- btnBrowseGdb.setText("Browse...");
-
- Label lblNewLabel = new Label(grpGdb, SWT.NONE);
- lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
- lblNewLabel.setText("GDB Command File:");
-
- mGdbInitPathText = new Text(grpGdb, SWT.BORDER);
- mGdbInitPathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
- final Button btnBrowseGdbInit = new Button(grpGdb, SWT.NONE);
- btnBrowseGdbInit.setText("Browse...");
-
- SelectionListener browseListener = new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- Shell shell = ((Control) e.getSource()).getShell();
- if (e.getSource() == btnBrowseGdb) {
- browseForGdb(shell);
- } else {
- browseForGdbInit(shell);
- }
- checkParameters();
- updateLaunchConfigurationDialog();
- }
- };
- btnBrowseGdb.addSelectionListener(browseListener);
- btnBrowseGdbInit.addSelectionListener(browseListener);
-
- Label lblPort = new Label(grpGdb, SWT.NONE);
- lblPort.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
- lblPort.setText("Port:");
-
- mGdbRemotePortText = new Text(grpGdb, SWT.BORDER);
- GridData gd_text_2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
- gd_text_2.widthHint = 100;
- mGdbRemotePortText.setLayoutData(gd_text_2);
-
- ModifyListener m = new ModifyListener() {
- @Override
- public void modifyText(ModifyEvent e) {
- checkParameters();
- updateLaunchConfigurationDialog();
- }
- };
- mGdbPathText.addModifyListener(m);
- mGdbInitPathText.addModifyListener(m);
- mGdbRemotePortText.addModifyListener(m);
-
- Group grpSharedLibraries = new Group(comp, SWT.NONE);
- grpSharedLibraries.setText("Shared Libraries");
- grpSharedLibraries.setLayout(new GridLayout(2, false));
- GridData gd_grpSharedLibraries = new GridData(GridData.FILL_BOTH);
- gd_grpSharedLibraries.verticalAlignment = SWT.TOP;
- gd_grpSharedLibraries.grabExcessVerticalSpace = true;
- grpSharedLibraries.setLayoutData(gd_grpSharedLibraries);
-
- mSoliblist = new org.eclipse.swt.widgets.List(grpSharedLibraries,
- SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE);
- GridData gd_list = new GridData(GridData.FILL_BOTH);
- gd_list.heightHint = 133;
- gd_list.grabExcessVerticalSpace = false;
- gd_list.verticalSpan = 1;
- mSoliblist.setLayoutData(gd_list);
-
- Composite composite = new Composite(grpSharedLibraries, SWT.NONE);
- composite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
- composite.setLayout(new RowLayout(SWT.VERTICAL));
-
- mAddSolibButton = new Button(composite, SWT.NONE);
- mAddSolibButton.setText("Add...");
-
- mDeleteSolibButton = new Button(composite, SWT.NONE);
- mDeleteSolibButton.setText("Remove");
- mDeleteSolibButton.setEnabled(false);
-
- SelectionListener l = new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- Control c = (Control) e.getSource();
- if (c == mSoliblist) {
- // enable delete only if there is a selection
- mDeleteSolibButton.setEnabled(mSoliblist.getSelectionCount() > 0);
- } else if (c == mAddSolibButton) {
- addSolib(c.getShell());
- } else {
- // delete current selection
- int index = mSoliblist.getSelectionIndex();
- if (index >= 0) {
- mSoliblist.remove(index);
- }
- }
- updateLaunchConfigurationDialog();
- }
- };
-
- mSoliblist.addSelectionListener(l);
- mAddSolibButton.addSelectionListener(l);
- mDeleteSolibButton.addSelectionListener(l);
- }
-
- private void addSolib(Shell shell) {
- DirectoryDialog dd = new DirectoryDialog(shell);
- if (sLastSolibPath != null) {
- dd.setFilterPath(sLastSolibPath);
- }
- String solibPath = dd.open();
-
- if (solibPath != null) {
- mSoliblist.add(solibPath);
- sLastSolibPath = new File(solibPath).getParent();
- }
- }
-
- private void browseForGdb(Shell shell) {
- if (sLastGdbPath == null) {
- sLastGdbPath = NdkManager.getNdkLocation();
- }
-
- FileDialog fd = new FileDialog(shell);
- fd.setFilterPath(sLastGdbPath);
-
- String gdbPath = fd.open();
- if (gdbPath != null) {
- mGdbPathText.setText(gdbPath);
- sLastGdbPath = new File(gdbPath).getParent();
- }
- }
-
- private void browseForGdbInit(Shell shell) {
- FileDialog fd = new FileDialog(shell);
- String gdbInit = fd.open();
- if (gdbInit != null) {
- mGdbInitPathText.setText(gdbInit);
- }
- }
-
- private void checkParameters() {
- // check gdb path
- String gdb = mGdbPathText.getText().trim();
- if (!gdb.equals(NdkLaunchConstants.DEFAULT_GDB)) {
- File f = new File(gdb);
- if (!f.exists() || !f.canExecute()) {
- setErrorMessage("Invalid gdb location.");
- return;
- }
- }
-
- // check gdb init path
- String gdbInit = mGdbInitPathText.getText().trim();
- if (!gdbInit.isEmpty()) {
- File f = new File(gdbInit);
- if (!f.exists() || !f.isFile()) {
- setErrorMessage("Invalid gdbinit location.");
- return;
- }
- }
-
- // port should be a valid integer
- String port = mGdbRemotePortText.getText().trim();
- try {
- Integer.parseInt(port, 10);
- } catch (NumberFormatException e) {
- setErrorMessage("Port should be a valid integer");
- return;
- }
-
- // no errors
- setErrorMessage(null);
- setMessage(null);
- }
-
- @Override
- public void setDefaults(ILaunchConfigurationWorkingCopy config) {
- NdkHelper.setLaunchConfigDefaults(config);
- }
-
- @Override
- public void initializeFrom(ILaunchConfiguration config) {
- mGdbPathText.setText(getAttribute(config, NdkLaunchConstants.ATTR_NDK_GDB,
- NdkLaunchConstants.DEFAULT_GDB));
- mGdbInitPathText.setText(getAttribute(config,
- IGDBLaunchConfigurationConstants.ATTR_GDB_INIT,
- NdkLaunchConstants.DEFAULT_GDBINIT));
- mGdbRemotePortText.setText(getAttribute(config, IGDBLaunchConfigurationConstants.ATTR_PORT,
- NdkLaunchConstants.DEFAULT_GDB_PORT));
-
- List<String> solibs = getAttribute(config, NdkLaunchConstants.ATTR_NDK_SOLIB,
- Collections.EMPTY_LIST);
- mSoliblist.removeAll();
- for (String s: solibs) {
- mSoliblist.add(s);
- }
- }
-
- private String getAttribute(ILaunchConfiguration config, String key, String defaultValue) {
- try {
- return config.getAttribute(key, defaultValue);
- } catch (CoreException e) {
- return defaultValue;
- }
- }
-
- private List<String> getAttribute(ILaunchConfiguration config, String key,
- List<String> defaultValue) {
- try {
- return config.getAttribute(key, defaultValue);
- } catch (CoreException e) {
- return defaultValue;
- }
- }
-
- @Override
- public void performApply(ILaunchConfigurationWorkingCopy config) {
- config.setAttribute(NdkLaunchConstants.ATTR_NDK_GDB, mGdbPathText.getText().trim());
- config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_GDB_INIT,
- mGdbInitPathText.getText().trim());
- config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_PORT,
- mGdbRemotePortText.getText().trim());
- config.setAttribute(NdkLaunchConstants.ATTR_NDK_SOLIB,
- Arrays.asList(mSoliblist.getItems()));
- }
-
- @Override
- public String getName() {
- return "Debugger";
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchConfigTabGroups.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchConfigTabGroups.java
deleted file mode 100644
index f8cf73c9f..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchConfigTabGroups.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.eclipse.org/org/documents/epl-v10.php
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.eclipse.ndk.internal.launch;
-
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
-import org.eclipse.debug.ui.CommonTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
-
-public class NdkGdbLaunchConfigTabGroups extends AbstractLaunchConfigurationTabGroup {
- public NdkGdbLaunchConfigTabGroups() {
- }
-
- @Override
- public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
- ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
- new NdkMainLaunchConfigTab(),
- new NdkDebuggerTab(),
- new SourceLookupTab(),
- new CommonTab()
- };
- setTabs(tabs);
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchDelegate.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchDelegate.java
deleted file mode 100644
index 0b124f249..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchDelegate.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.eclipse.org/org/documents/epl-v10.php
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.eclipse.ndk.internal.launch;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.Client;
-import com.android.ddmlib.CollectingOutputReceiver;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.IDevice.DeviceUnixSocketNamespace;
-import com.android.ddmlib.InstallException;
-import com.android.ddmlib.ShellCommandUnresponsiveException;
-import com.android.ddmlib.SyncException;
-import com.android.ddmlib.TimeoutException;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.ManifestData.Activity;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchController;
-import com.android.ide.eclipse.adt.internal.launch.DeviceChooserDialog;
-import com.android.ide.eclipse.adt.internal.launch.DeviceChooserDialog.DeviceChooserResponse;
-import com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.ndk.internal.NativeAbi;
-import com.android.ide.eclipse.ndk.internal.NdkHelper;
-import com.android.ide.eclipse.ndk.internal.NdkVariables;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.google.common.base.Joiner;
-
-import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.debug.core.CDebugUtils;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
-import org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.variables.IStringVariableManager;
-import org.eclipse.core.variables.IValueVariable;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.jface.dialogs.Dialog;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-@SuppressWarnings("restriction")
-public class NdkGdbLaunchDelegate extends GdbLaunchDelegate {
- public static final String LAUNCH_TYPE_ID =
- "com.android.ide.eclipse.ndk.debug.LaunchConfigType"; //$NON-NLS-1$
-
- private static final Joiner JOINER = Joiner.on(", ").skipNulls();
-
- private static final String DEBUG_SOCKET = "debugsock"; //$NON-NLS-1$
-
- @Override
- public void launch(ILaunchConfiguration config, String mode, ILaunch launch,
- IProgressMonitor monitor) throws CoreException {
- boolean launched = doLaunch(config, mode, launch, monitor);
- if (!launched) {
- if (launch.canTerminate()) {
- launch.terminate();
- }
- DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);
- }
- }
-
- public boolean doLaunch(final ILaunchConfiguration config, String mode, ILaunch launch,
- IProgressMonitor monitor) throws CoreException {
- IProject project = null;
- ICProject cProject = CDebugUtils.getCProject(config);
- if (cProject != null) {
- project = cProject.getProject();
- }
-
- if (project == null) {
- AdtPlugin.printErrorToConsole(
- Messages.NdkGdbLaunchDelegate_LaunchError_CouldNotGetProject);
- return false;
- }
-
- // make sure the project and its dependencies are built and PostCompilerBuilder runs.
- // This is a synchronous call which returns when the build is done.
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_PerformIncrementalBuild);
- ProjectHelper.doFullIncrementalDebugBuild(project, monitor);
-
- // check if the project has errors, and abort in this case.
- if (ProjectHelper.hasError(project, true)) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_ProjectHasErrors);
- return false;
- }
-
- final ManifestData manifestData = AndroidManifestHelper.parseForData(project);
- final ManifestInfo manifestInfo = ManifestInfo.get(project);
- final AndroidVersion minSdkVersion = new AndroidVersion(
- manifestInfo.getMinSdkVersion(),
- manifestInfo.getMinSdkCodeName());
-
- // Get the activity name to launch
- String activityName = getActivityToLaunch(
- getActivityNameInLaunchConfig(config),
- manifestData.getLauncherActivity(),
- manifestData.getActivities(),
- project);
-
- // Get ABI's supported by the application
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_ObtainAppAbis);
- Collection<NativeAbi> appAbis = NdkHelper.getApplicationAbis(project, monitor);
- if (appAbis.size() == 0) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_UnableToDetectAppAbi);
- return false;
- }
-
- // Obtain device to use:
- // - if there is only 1 device, just use that
- // - if we have previously launched this config, and the device used is present, use that
- // - otherwise show the DeviceChooserDialog
- final String configName = config.getName();
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_ObtainDevice);
- IDevice device = null;
- IDevice[] devices = AndroidDebugBridge.getBridge().getDevices();
- if (devices.length == 1) {
- device = devices[0];
- } else if ((device = getLastUsedDevice(config, devices)) == null) {
- final IAndroidTarget projectTarget = Sdk.getCurrent().getTarget(project);
- final DeviceChooserResponse response = new DeviceChooserResponse();
- final boolean continueLaunch[] = new boolean[] { false };
- AdtPlugin.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- DeviceChooserDialog dialog = new DeviceChooserDialog(
- AdtPlugin.getDisplay().getActiveShell(),
- response,
- manifestData.getPackage(),
- projectTarget, minSdkVersion, false /*** FIXME! **/);
- if (dialog.open() == Dialog.OK) {
- AndroidLaunchController.updateLaunchConfigWithLastUsedDevice(config,
- response);
- continueLaunch[0] = true;
- }
- };
- });
-
- if (!continueLaunch[0]) {
- return false;
- }
-
- device = response.getDeviceToUse();
- }
-
- // ndk-gdb requires device > Froyo
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_CheckAndroidDeviceVersion);
- AndroidVersion deviceVersion = Sdk.getDeviceVersion(device);
- if (deviceVersion == null) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_UnknownAndroidDeviceVersion);
- return false;
- } else if (!deviceVersion.isGreaterOrEqualThan(8)) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_Api8Needed);
- return false;
- }
-
- // get Device ABI
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_ObtainDeviceABI);
- String deviceAbi1 = device.getProperty("ro.product.cpu.abi"); //$NON-NLS-1$
- String deviceAbi2 = device.getProperty("ro.product.cpu.abi2"); //$NON-NLS-1$
-
- // get the abi that is supported by both the device and the application
- NativeAbi compatAbi = getCompatibleAbi(deviceAbi1, deviceAbi2, appAbis);
- if (compatAbi == null) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_NoCompatibleAbi);
- AdtPlugin.printErrorToConsole(project,
- String.format("ABI's supported by the application: %s", JOINER.join(appAbis)));
- AdtPlugin.printErrorToConsole(project,
- String.format("ABI's supported by the device: %s, %s", //$NON-NLS-1$
- deviceAbi1,
- deviceAbi2));
- return false;
- }
-
- // sync app
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_SyncAppToDevice);
- IFile apk = ProjectHelper.getApplicationPackage(project);
- if (apk == null) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_NullApk);
- return false;
- }
- try {
- device.installPackage(apk.getLocation().toOSString(), true);
- } catch (InstallException e1) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_InstallError, e1);
- return false;
- }
-
- // launch activity
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_ActivityLaunch + activityName);
- String command = String.format("am start -n %s/%s", manifestData.getPackage(), //$NON-NLS-1$
- activityName);
- try {
- CountDownLatch launchedLatch = new CountDownLatch(1);
- CollectingOutputReceiver receiver = new CollectingOutputReceiver(launchedLatch);
- device.executeShellCommand(command, receiver);
- launchedLatch.await(5, TimeUnit.SECONDS);
- String shellOutput = receiver.getOutput();
- if (shellOutput.contains("Error type")) { //$NON-NLS-1$
- throw new RuntimeException(receiver.getOutput());
- }
- } catch (Exception e) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_ActivityLaunchError, e);
- return false;
- }
-
- // kill existing gdbserver
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_KillExistingGdbServer);
- for (Client c: device.getClients()) {
- String description = c.getClientData().getClientDescription();
- if (description != null && description.contains("gdbserver")) { //$NON-NLS-1$
- c.kill();
- }
- }
-
- // pull app_process & libc from the device
- IPath solibFolder = project.getLocation().append("obj/local").append(compatAbi.getAbi());
- try {
- pull(device, "/system/bin/app_process", solibFolder); //$NON-NLS-1$
- pull(device, "/system/lib/libc.so", solibFolder); //$NON-NLS-1$
- } catch (Exception e) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_PullFileError, e);
- return false;
- }
-
- // wait for a couple of seconds for activity to be launched
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_WaitingForActivity);
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e1) {
- // uninterrupted
- }
-
- // get pid of activity
- Client app = device.getClient(manifestData.getPackage());
- int pid = app.getClientData().getPid();
-
- // launch gdbserver
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_LaunchingGdbServer);
- CountDownLatch attachLatch = new CountDownLatch(1);
- GdbServerTask gdbServer = new GdbServerTask(device, manifestData.getPackage(),
- DEBUG_SOCKET, pid, attachLatch);
- new Thread(gdbServer,
- String.format("gdbserver for %s", manifestData.getPackage())).start(); //$NON-NLS-1$
-
- // wait for gdbserver to attach
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_WaitGdbServerAttach);
- boolean attached = false;
- try {
- attached = attachLatch.await(3, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_InterruptedWaitingForGdbserver);
- return false;
- }
-
- // if gdbserver failed to attach, we report any errors that may have occurred
- if (!attached) {
- if (gdbServer.getLaunchException() != null) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_gdbserverLaunchException,
- gdbServer.getLaunchException());
- } else {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_gdbserverOutput,
- gdbServer.getShellOutput());
- }
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_VerifyIfDebugBuild);
-
- // shut down the gdbserver thread
- gdbServer.setCancelled();
- return false;
- }
-
- // Obtain application working directory
- String appDir = null;
- try {
- appDir = getAppDirectory(device, manifestData.getPackage(), 5, TimeUnit.SECONDS);
- } catch (Exception e) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_ObtainingAppFolder, e);
- return false;
- }
-
- // setup port forwarding between local port & remote (device) unix domain socket
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_SettingUpPortForward);
- String localport = config.getAttribute(IGDBLaunchConfigurationConstants.ATTR_PORT,
- NdkLaunchConstants.DEFAULT_GDB_PORT);
- try {
- device.createForward(Integer.parseInt(localport),
- String.format("%s/%s", appDir, DEBUG_SOCKET), //$NON-NLS-1$
- DeviceUnixSocketNamespace.FILESYSTEM);
- } catch (Exception e) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_PortForwarding, e);
- return false;
- }
-
- // update launch attributes based on device
- ILaunchConfiguration config2 = performVariableSubstitutions(config, project, compatAbi,
- monitor);
-
- // launch gdb
- monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_LaunchHostGdb);
- super.launch(config2, mode, launch, monitor);
- return true;
- }
-
- @Nullable
- private IDevice getLastUsedDevice(ILaunchConfiguration config, @NonNull IDevice[] devices) {
- try {
- boolean reuse = config.getAttribute(LaunchConfigDelegate.ATTR_REUSE_LAST_USED_DEVICE,
- false);
- if (!reuse) {
- return null;
- }
-
- String serial = config.getAttribute(LaunchConfigDelegate.ATTR_LAST_USED_DEVICE,
- (String)null);
- return AndroidLaunchController.getDeviceIfOnline(serial, devices);
- } catch (CoreException e) {
- return null;
- }
- }
-
- private void pull(IDevice device, String remote, IPath solibFolder) throws
- SyncException, IOException, AdbCommandRejectedException, TimeoutException {
- String remoteFileName = new Path(remote).toFile().getName();
- String targetFile = solibFolder.append(remoteFileName).toString();
- device.pullFile(remote, targetFile);
- }
-
- private ILaunchConfiguration performVariableSubstitutions(ILaunchConfiguration config,
- IProject project, NativeAbi compatAbi, IProgressMonitor monitor) throws CoreException {
- ILaunchConfigurationWorkingCopy wcopy = config.getWorkingCopy();
-
- String toolchainPrefix = NdkHelper.getToolchainPrefix(project, compatAbi, monitor);
- String gdb = toolchainPrefix + "gdb"; //$NON-NLS-1$
-
- IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
- IValueVariable ndkGdb = manager.newValueVariable(NdkVariables.NDK_GDB,
- NdkVariables.NDK_GDB, true, gdb);
- IValueVariable ndkProject = manager.newValueVariable(NdkVariables.NDK_PROJECT,
- NdkVariables.NDK_PROJECT, true, project.getLocation().toOSString());
- IValueVariable ndkCompatAbi = manager.newValueVariable(NdkVariables.NDK_COMPAT_ABI,
- NdkVariables.NDK_COMPAT_ABI, true, compatAbi.getAbi());
-
- IValueVariable[] ndkVars = new IValueVariable[] { ndkGdb, ndkProject, ndkCompatAbi };
- manager.addVariables(ndkVars);
-
- // fix path to gdb
- String userGdbPath = wcopy.getAttribute(NdkLaunchConstants.ATTR_NDK_GDB,
- NdkLaunchConstants.DEFAULT_GDB);
- wcopy.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUG_NAME,
- elaborateExpression(manager, userGdbPath));
-
- // setup program name
- wcopy.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME,
- elaborateExpression(manager, NdkLaunchConstants.DEFAULT_PROGRAM));
-
- // fix solib paths
- List<String> solibPaths = wcopy.getAttribute(
- NdkLaunchConstants.ATTR_NDK_SOLIB,
- Collections.singletonList(NdkLaunchConstants.DEFAULT_SOLIB_PATH));
- List<String> fixedSolibPaths = new ArrayList<String>(solibPaths.size());
- for (String u : solibPaths) {
- fixedSolibPaths.add(elaborateExpression(manager, u));
- }
- wcopy.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_SOLIB_PATH,
- fixedSolibPaths);
-
- manager.removeVariables(ndkVars);
-
- return wcopy.doSave();
- }
-
- private String elaborateExpression(IStringVariableManager manager, String expr)
- throws CoreException{
- boolean DEBUG = true;
-
- String eval = manager.performStringSubstitution(expr);
- if (DEBUG) {
- AdtPlugin.printToConsole("Substitute: ", expr, " --> ", eval);
- }
-
- return eval;
- }
-
- /**
- * Returns the activity name to launch. If the user has requested a particular activity to
- * be launched, then this method will confirm that the requested activity is defined in the
- * manifest. If the user has not specified any activities, then it returns the default
- * launcher activity.
- * @param activityNameInLaunchConfig activity to launch as requested by the user.
- * @param activities list of activities as defined in the application's manifest
- * @param project android project
- * @return activity name that should be launched, or null if no launchable activity.
- */
- private String getActivityToLaunch(String activityNameInLaunchConfig, Activity launcherActivity,
- Activity[] activities, IProject project) {
- if (activities.length == 0) {
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_NoActivityInManifest);
- return null;
- } else if (activityNameInLaunchConfig == null && launcherActivity != null) {
- return launcherActivity.getName();
- } else {
- for (Activity a : activities) {
- if (a != null && a.getName().equals(activityNameInLaunchConfig)) {
- return activityNameInLaunchConfig;
- }
- }
-
- AdtPlugin.printErrorToConsole(project,
- Messages.NdkGdbLaunchDelegate_LaunchError_NoSuchActivity);
- if (launcherActivity != null) {
- return launcherActivity.getName();
- } else {
- AdtPlugin.printErrorToConsole(
- Messages.NdkGdbLaunchDelegate_LaunchError_NoLauncherActivity);
- return null;
- }
- }
- }
-
- private NativeAbi getCompatibleAbi(String deviceAbi1, String deviceAbi2,
- Collection<NativeAbi> appAbis) {
- for (NativeAbi abi: appAbis) {
- if (abi.getAbi().equals(deviceAbi1) || abi.getAbi().equals(deviceAbi2)) {
- return abi;
- }
- }
-
- return null;
- }
-
- /** Returns the name of the activity as defined in the launch configuration. */
- private String getActivityNameInLaunchConfig(ILaunchConfiguration configuration) {
- String empty = ""; //$NON-NLS-1$
- String activityName;
- try {
- activityName = configuration.getAttribute(LaunchConfigDelegate.ATTR_ACTIVITY, empty);
- } catch (CoreException e) {
- return null;
- }
-
- return (activityName != empty) ? activityName : null;
- }
-
- private String getAppDirectory(IDevice device, String app, long timeout, TimeUnit timeoutUnit)
- throws TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException,
- IOException, InterruptedException {
- String command = String.format("run-as %s /system/bin/sh -c pwd", app); //$NON-NLS-1$
-
- CountDownLatch commandCompleteLatch = new CountDownLatch(1);
- CollectingOutputReceiver receiver = new CollectingOutputReceiver(commandCompleteLatch);
- device.executeShellCommand(command, receiver);
- commandCompleteLatch.await(timeout, timeoutUnit);
- return receiver.getOutput().trim();
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchShortcut.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchShortcut.java
deleted file mode 100644
index 22eb118a2..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchShortcut.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.eclipse.org/org/documents/epl-v10.php
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.eclipse.ndk.internal.launch;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchController;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.ndk.internal.NdkHelper;
-
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchShortcut;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorPart;
-
-@SuppressWarnings("restriction") // for adt.internal classes
-public class NdkGdbLaunchShortcut implements ILaunchShortcut {
- @Override
- public void launch(ISelection selection, String mode) {
- if (!(selection instanceof IStructuredSelection)) {
- return;
- }
-
- Object s = ((IStructuredSelection) selection).getFirstElement();
- if (!(s instanceof IAdaptable)) {
- return;
- }
-
- IResource r = (IResource) ((IAdaptable) s).getAdapter(IResource.class);
- if (r == null) {
- return;
- }
-
- IProject project = r.getProject();
- if (project == null) {
- return;
- }
-
- // verify that this is a non library Android project
- ProjectState state = Sdk.getProjectState(project);
- if (state == null || state.isLibrary()) {
- return;
- }
-
- // verify that this project has C/C++ nature
- if (!CoreModel.hasCCNature(project) && !CoreModel.hasCNature(project)) {
- AdtPlugin.printErrorToConsole(project,
- String.format("Selected project (%s) does not have C/C++ nature. "
- + "To add native support, right click on the project, "
- + "Android Tools -> Add Native Support",
- project.getName()));
- return;
- }
-
- debugProject(project, mode);
- }
-
- @Override
- public void launch(IEditorPart editor, String mode) {
- }
-
- private void debugProject(IProject project, String mode) {
- // obtain existing native debug config for project
- ILaunchConfiguration config = AndroidLaunchController.getLaunchConfig(project,
- NdkGdbLaunchDelegate.LAUNCH_TYPE_ID);
- if (config == null) {
- return;
- }
-
- // Set the ndk gdb specific launch attributes in the config (if necessary)
- if (!hasNdkAttributes(config)) {
- try {
- config = setNdkDefaults(config, project);
- } catch (CoreException e) {
- AdtPlugin.printErrorToConsole(project,
- "Unable to create launch configuration for project.");
- return;
- }
- }
-
- // launch
- DebugUITools.launch(config, mode);
- }
-
- private boolean hasNdkAttributes(ILaunchConfiguration config) {
- try {
- // All NDK launch configurations have ATTR_REMOTE_TCP set to true
- boolean isRemote = config.getAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP,
- false);
- return isRemote;
- } catch (CoreException e) {
- return false;
- }
- }
-
- private ILaunchConfiguration setNdkDefaults(ILaunchConfiguration config, IProject project)
- throws CoreException {
- ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
- NdkHelper.setLaunchConfigDefaults(wc);
- wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, project.getName());
- return wc.doSave();
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkLaunchConstants.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkLaunchConstants.java
deleted file mode 100644
index ff70b2e1f..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkLaunchConstants.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.eclipse.org/org/documents/epl-v10.php
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.eclipse.ndk.internal.launch;
-
-import com.android.ide.eclipse.ndk.internal.Activator;
-import com.android.ide.eclipse.ndk.internal.NdkVariables;
-
-public class NdkLaunchConstants {
- private static final String PREFIX = Activator.PLUGIN_ID + ".ndklaunch."; //$NON-NLS-1$
-
- public static final String ATTR_NDK_GDB = PREFIX + "gdb"; //$NON-NLS-1$
- public static final String ATTR_NDK_GDBINIT = PREFIX + "gdbinit"; //$NON-NLS-1$
- public static final String ATTR_NDK_SOLIB = PREFIX + "solib"; //$NON-NLS-1$
-
- public static final String DEFAULT_GDB_PORT = "5039"; //$NON-NLS-1$
- public static final String DEFAULT_GDB = getVar(NdkVariables.NDK_GDB);
- public static final String DEFAULT_GDBINIT = ""; //$NON-NLS-1$
- public static final String DEFAULT_PROGRAM =
- String.format("%1$s/obj/local/%2$s/app_process", //$NON-NLS-1$
- getVar(NdkVariables.NDK_PROJECT),
- getVar(NdkVariables.NDK_COMPAT_ABI));
- public static final String DEFAULT_SOLIB_PATH =
- String.format("%1$s/obj/local/%2$s/", //$NON-NLS-1$
- getVar(NdkVariables.NDK_PROJECT),
- getVar(NdkVariables.NDK_COMPAT_ABI));
-
- private static String getVar(String varName) {
- return "${" + varName + '}'; //$NON-NLS-1$
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkMainLaunchConfigTab.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkMainLaunchConfigTab.java
deleted file mode 100644
index 1e4b39e91..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkMainLaunchConfigTab.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.eclipse.org/org/documents/epl-v10.php
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.eclipse.ndk.internal.launch;
-
-import com.android.ide.eclipse.adt.internal.launch.MainLaunchConfigTab;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.IProjectChooserFilter;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-
-@SuppressWarnings("restriction")
-public class NdkMainLaunchConfigTab extends MainLaunchConfigTab {
- private static class NdkProjectOnlyFilter implements IProjectChooserFilter {
- @Override
- public boolean accept(IProject project) {
- ProjectState state = Sdk.getProjectState(project);
- if (state == null) {
- return false;
- }
-
- return !state.isLibrary()
- && (CoreModel.hasCCNature(project) || CoreModel.hasCNature(project));
- }
-
- @Override
- public boolean useCache() {
- return true;
- }
- }
-
- @Override
- protected IProjectChooserFilter getProjectFilter() {
- return new NdkProjectOnlyFilter();
- }
-
- @Override
- public void performApply(ILaunchConfigurationWorkingCopy configuration) {
- super.performApply(configuration);
-
- configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME,
- mProjText.getText().trim());
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/messages.properties b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/messages.properties
deleted file mode 100644
index 6770f2de4..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/messages.properties
+++ /dev/null
@@ -1,32 +0,0 @@
-NdkGdbLaunchDelegate_Action_ActivityLaunch=Launching activity
-NdkGdbLaunchDelegate_Action_CheckAndroidDeviceVersion=Checking Android version on device
-NdkGdbLaunchDelegate_Action_KillExistingGdbServer=Killing existing gdbserver
-NdkGdbLaunchDelegate_Action_LaunchHostGdb=Launching host gdb
-NdkGdbLaunchDelegate_Action_LaunchingGdbServer=Launching gdbserver
-NdkGdbLaunchDelegate_Action_ObtainAppAbis=Obtaining ABI's supported by the application
-NdkGdbLaunchDelegate_Action_ObtainDevice=Obtaining device to use
-NdkGdbLaunchDelegate_Action_ObtainDeviceABI=Obtaining ABI's supported by the device
-NdkGdbLaunchDelegate_Action_PerformIncrementalBuild=Performing Incremental Build
-NdkGdbLaunchDelegate_Action_SettingUpPortForward=Setting up port forwarding
-NdkGdbLaunchDelegate_Action_SyncAppToDevice=Syncing application to device
-NdkGdbLaunchDelegate_Action_WaitGdbServerAttach=Waiting for gdbserver to attach to process
-NdkGdbLaunchDelegate_Action_WaitingForActivity=Waiting for activity to be launched
-NdkGdbLaunchDelegate_LaunchError_ActivityLaunchError=Error launching activity
-NdkGdbLaunchDelegate_LaunchError_Api8Needed=Native debugging requires API level 8 or above.
-NdkGdbLaunchDelegate_LaunchError_CouldNotGetProject=Couldn't get project object\!
-NdkGdbLaunchDelegate_LaunchError_gdbserverLaunchException=Exception while launching gdbserver:
-NdkGdbLaunchDelegate_LaunchError_gdbserverOutput=gdbserver output:
-NdkGdbLaunchDelegate_LaunchError_InstallError=Installation error
-NdkGdbLaunchDelegate_LaunchError_InterruptedWaitingForGdbserver=Interrupted while waiting for gdbserver to attach
-NdkGdbLaunchDelegate_LaunchError_NoActivityInManifest=The Manifest defines no activity\!
-NdkGdbLaunchDelegate_LaunchError_NoCompatibleAbi=Unable to find a compatible ABI
-NdkGdbLaunchDelegate_LaunchError_NoLauncherActivity=No launcher activity specified. Aborting launch.
-NdkGdbLaunchDelegate_LaunchError_NoSuchActivity=The specified activity does not exist\! Getting the launcher activity.
-NdkGdbLaunchDelegate_LaunchError_NullApk=Null APK
-NdkGdbLaunchDelegate_LaunchError_ObtainingAppFolder=Error while obtaining application data folder on device
-NdkGdbLaunchDelegate_LaunchError_PortForwarding=Error while setting up port forwarding
-NdkGdbLaunchDelegate_LaunchError_ProjectHasErrors=Your project contains error(s), please fix them before running your application.
-NdkGdbLaunchDelegate_LaunchError_PullFileError=Error while obtaining file from device
-NdkGdbLaunchDelegate_LaunchError_UnableToDetectAppAbi=Unable to detect application ABI's
-NdkGdbLaunchDelegate_LaunchError_UnknownAndroidDeviceVersion=Unknown Android version on device.
-NdkGdbLaunchDelegate_LaunchError_VerifyIfDebugBuild=Verify if the application was built with NDK_DEBUG=1