package com.mobilesorcery.sdk.builder.android.launch; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.debug.mi.core.IMITTY; import org.eclipse.cdt.debug.mi.core.MIException; import org.eclipse.cdt.debug.mi.core.MIProcess; import org.eclipse.cdt.debug.mi.core.MISession; import org.eclipse.cdt.debug.mi.core.MITTYAdapter; import org.eclipse.cdt.debug.mi.core.cdi.Session; import org.eclipse.cdt.debug.mi.core.command.CommandFactory; import org.eclipse.cdt.utils.pty.PTY; 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.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import com.mobilesorcery.sdk.builder.android.Activator; import com.mobilesorcery.sdk.builder.android.AndroidPackager; import com.mobilesorcery.sdk.builder.android.NdkToolchain; import com.mobilesorcery.sdk.builder.android.PropertyInitializer; import com.mobilesorcery.sdk.core.IBuildVariant; import com.mobilesorcery.sdk.core.MoSyncProject; import com.mobilesorcery.sdk.core.MoSyncTool; import com.mobilesorcery.sdk.internal.debug.MoSyncDebugger; public class AndroidNDKDebugger extends MoSyncDebugger { private String serialNumber; public void setSerialNumber(String serialNumber) { this.serialNumber = serialNumber; } protected IPath getGDBPath(ILaunch launch) throws CoreException { NdkToolchain toolchain = Activator.getDefault().getPreferredNdkToolchain(); if (toolchain == null) { throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "No ndk toolchain found!")); } IPath gdb = toolchain.getTool(null, "gdb"); return gdb; } protected String[] getGDBCommandLine(String gdb, String[] extraArgs, File executable, IProject project, IBuildVariant variant, CommandFactory factory, boolean usePty) throws CoreException { gdb = getGDBPath(null).toOSString(); IMITTY pty = null; if (usePty) { try { PTY pseudo = new PTY(); pty = new MITTYAdapter(pseudo); } catch (IOException e) { // Should we not print/log this ? } } ArrayList<String> argList = new ArrayList<String>(extraArgs.length + 8); argList.add(gdb); argList.add("-q"); //$NON-NLS-1$ argList.add("-nw"); //$NON-NLS-1$ argList.add("-i"); //$NON-NLS-1$ argList.add(factory.getMIVersion()); if (pty != null) { argList.add("-tty"); //$NON-NLS-1$ argList.add(pty.getSlaveName()); } return argList.toArray(new String[argList.size()]); } protected Session createSession(IBuildVariant variant, int sessionType, String gdb, CommandFactory factory, File program, String[] extraArgs, boolean usePty, IProject project, IProgressMonitor monitor) throws IOException, MIException, CoreException { MoSyncProject mosyncProject = MoSyncProject.create(project); String packageName = mosyncProject.getProperty(PropertyInitializer.ANDROID_PACKAGE_NAME); try { ADB.getExternal().setupGdb(serialNumber, packageName, 5039); } catch (CoreException e) { throw new IOException("Could not start debugging on-device", e); } return super.createSession(variant, sessionType, gdb, factory, program, extraArgs, usePty, project, monitor); } protected CommandFactory getCommandFactory(ILaunchConfiguration config) throws CoreException { return getDefaultCommandFactory(config); } protected MISession createMISession0(int type, MIProcess process, CommandFactory commandFactory, IMITTY pty, int timeout) throws MIException { AndroidNDKMISession session = new AndroidNDKMISession(process, pty, type, commandFactory, timeout); session.setSerialNumber(serialNumber); return session; } public static List<String> getLibraryPaths(MoSyncProject project, IBuildVariant variant, String serialNumber) throws CoreException { // NOTE NOTE NOTE: The .so with debug info is located in a different place! ArrayList<String> solibPaths = new ArrayList<String>(); ADB adb = ADB.getDefault(); String arch = adb.matchAbi(serialNumber, ADB.ABIS); String buildPath = AndroidPackager.computeNativeDebugLib(project, variant, arch).getParentFile().getAbsolutePath(); solibPaths.add(buildPath); String libsPath = MoSyncTool.getDefault().getMoSyncLib().append("android_" + arch + "_debug").toOSString(); solibPaths.add(libsPath); return solibPaths; } }