Get rid of uneeded extern, enum, typedef and struct qualifiers.

Change-Id: I236c5a1553a51f82c9bc3eaaab042046c854d3b4
diff --git a/dexdump/DexDump.cpp b/dexdump/DexDump.cpp
index 7d11752..59f149b 100644
--- a/dexdump/DexDump.cpp
+++ b/dexdump/DexDump.cpp
@@ -241,10 +241,10 @@
 /*
  * Flag for use with createAccessFlagStr().
  */
-typedef enum AccessFor {
+enum AccessFor {
     kAccessForClass = 0, kAccessForMethod = 1, kAccessForField = 2,
     kAccessForMAX
-} AccessFor;
+};
 
 /*
  * Create a new string with human-readable access flags.
diff --git a/vm/AllocTracker.h b/vm/AllocTracker.h
index fa8ba75..16d5168 100644
--- a/vm/AllocTracker.h
+++ b/vm/AllocTracker.h
@@ -19,16 +19,11 @@
 #ifndef _DALVIK_ALLOCTRACKER
 #define _DALVIK_ALLOCTRACKER
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* initialization */
 bool dvmAllocTrackerStartup(void);
 void dvmAllocTrackerShutdown(void);
 
 struct AllocRecord;
-typedef struct AllocRecord AllocRecord;
 
 /*
  * Enable allocation tracking.  Does nothing if tracking is already enabled.
@@ -64,8 +59,4 @@
  */
 void dvmDumpTrackedAllocations(bool enable);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_ALLOCTRACKER*/
diff --git a/vm/Atomic.h b/vm/Atomic.h
index 713c5b4..9d43332 100644
--- a/vm/Atomic.h
+++ b/vm/Atomic.h
@@ -23,10 +23,6 @@
 #include <cutils/atomic.h>          /* use common Android atomic ops */
 #include <cutils/atomic-inline.h>   /* and some uncommon ones */
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * NOTE: Two "quasiatomic" operations on the exact same memory address
  * are guaranteed to operate atomically with respect to each other,
@@ -42,12 +38,12 @@
  * Swap the 64-bit value at "addr" with "value".  Returns the previous
  * value.
  */
-int64_t dvmQuasiAtomicSwap64(int64_t value, volatile int64_t* addr);
+extern "C" int64_t dvmQuasiAtomicSwap64(int64_t value, volatile int64_t* addr);
 
 /*
  * Read the 64-bit value at "addr".
  */
-int64_t dvmQuasiAtomicRead64(volatile const int64_t* addr);
+extern "C" int64_t dvmQuasiAtomicRead64(volatile const int64_t* addr);
 
 /*
  * If the value at "addr" is equal to "oldvalue", replace it with "newvalue"
@@ -56,8 +52,4 @@
 int dvmQuasiAtomicCas64(int64_t oldvalue, int64_t newvalue,
         volatile int64_t* addr);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_ATOMIC*/
diff --git a/vm/AtomicCache.h b/vm/AtomicCache.h
index 2342162..29f1ebc 100644
--- a/vm/AtomicCache.h
+++ b/vm/AtomicCache.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_ATOMICCACHE
 #define _DALVIK_ATOMICCACHE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * If set to "1", gather some stats on our caching success rate.
  */
@@ -35,12 +31,12 @@
  *
  * Must be exactly 16 bytes.
  */
-typedef struct AtomicCacheEntry {
+struct AtomicCacheEntry {
     u4          key1;
     u4          key2;
     u4          value;
     volatile u4 version;    /* version and lock flag */
-} AtomicCacheEntry;
+};
 
 /*
  * One cache.
@@ -49,7 +45,7 @@
  * struct and "entries" separately, avoiding an indirection.  (We already
  * handle "numEntries" separately in ATOMIC_CACHE_LOOKUP.)
  */
-typedef struct AtomicCache {
+struct AtomicCache {
     AtomicCacheEntry*   entries;        /* array of entries */
     int         numEntries;             /* #of entries, must be power of 2 */
 
@@ -61,7 +57,7 @@
     int         hits;                   /* found entry in cache */
     int         misses;                 /* entry was for other keys */
     int         fills;                  /* entry was empty */
-} AtomicCache;
+};
 
 /*
  * Do a cache lookup.  We need to be able to read and write entries
@@ -174,8 +170,4 @@
  */
 void dvmDumpAtomicCacheStats(const AtomicCache* pCache);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_ATOMICCACHE*/
diff --git a/vm/BitVector.h b/vm/BitVector.h
index 0d23350..01e2f1b 100644
--- a/vm/BitVector.h
+++ b/vm/BitVector.h
@@ -20,28 +20,24 @@
 #ifndef _DALVIK_BITVECTOR
 #define _DALVIK_BITVECTOR
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Expanding bitmap, used for tracking resources.  Bits are numbered starting
  * from zero.
  *
  * All operations on a BitVector are unsynchronized.
  */
-typedef struct BitVector {
+struct BitVector {
     bool    expandable;     /* expand bitmap if we run out? */
     u4      storageSize;    /* current size, in 32-bit words */
     u4*     storage;
-} BitVector;
+};
 
 /* Handy iterator to walk through the bit positions set to 1 */
-typedef struct BitVectorIterator {
+struct BitVectorIterator {
     BitVector *pBits;
     u4 idx;
     u4 bitSize;
-} BitVectorIterator;
+};
 
 /* allocate a bit vector with enough space to hold "startBits" bits */
 BitVector* dvmAllocBitVector(unsigned int startBits, bool expandable);
@@ -104,8 +100,4 @@
 /* Return the next position set to 1. -1 means end-of-vector reached */
 int dvmBitVectorIteratorNext(BitVectorIterator* iterator);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_BITVECTOR*/
diff --git a/vm/Common.h b/vm/Common.h
index 0ec9ec4..637ed18 100644
--- a/vm/Common.h
+++ b/vm/Common.h
@@ -31,10 +31,6 @@
 #include <endian.h>
 #include "utils/Log.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #if !defined(NDEBUG) && defined(WITH_DALVIK_ASSERT)
 # undef assert
 # define assert(x) \
@@ -106,8 +102,4 @@
 
 #define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_COMMON*/
diff --git a/vm/Ddm.h b/vm/Ddm.h
index af7f6e1..01f5d18 100644
--- a/vm/Ddm.h
+++ b/vm/Ddm.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_DDM
 #define _DALVIK_DDM
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Handle a packet full of DDM goodness.
  *
@@ -88,8 +84,4 @@
  */
 ArrayObject* dvmDdmGetRecentAllocations(void);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_DDM*/
diff --git a/vm/Debugger.cpp b/vm/Debugger.cpp
index ae3bb77..a9c8b98 100644
--- a/vm/Debugger.cpp
+++ b/vm/Debugger.cpp
@@ -153,9 +153,9 @@
 
 
 /* keep track of type, in case we need to distinguish them someday */
-typedef enum RegistryType {
+enum RegistryType {
     kObjectId = 0xc1, kRefTypeId
-} RegistryType;
+};
 
 /*
  * Hash function for object IDs.  Since objects are at least 8 bytes, and
@@ -1282,12 +1282,12 @@
     }
 }
 
-typedef struct DebugCallbackContext {
+struct DebugCallbackContext {
     int numItems;
     ExpandBuf* pReply;
     // used by locals table
     bool withGeneric;
-} DebugCallbackContext;
+};
 
 static int lineTablePositionsCb(void *cnxt, u4 address, u4 lineNum)
 {
@@ -2570,8 +2570,8 @@
  * The JDWP event mechanism has registered a single-step event.  Tell
  * the interpreter about it.
  */
-bool dvmDbgConfigureStep(ObjectId threadId, enum JdwpStepSize size,
-    enum JdwpStepDepth depth)
+bool dvmDbgConfigureStep(ObjectId threadId, JdwpStepSize size,
+    JdwpStepDepth depth)
 {
     Object* threadObj;
     Thread* thread;
@@ -2854,12 +2854,12 @@
 }
 
 // for dvmAddressSetForLine
-typedef struct AddressSetContext {
+struct AddressSetContext {
     bool lastAddressValid;
     u4 lastAddress;
     u4 lineNum;
     AddressSet *pSet;
-} AddressSetContext;
+};
 
 // for dvmAddressSetForLine
 static int addressSetCb (void *cnxt, u4 address, u4 lineNum)
diff --git a/vm/Debugger.h b/vm/Debugger.h
index dd9679f..aaef02d 100644
--- a/vm/Debugger.h
+++ b/vm/Debugger.h
@@ -26,10 +26,6 @@
 #include "Misc.h"
 #include "jdwp/Jdwp.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* fwd decl */
 struct Object;
 struct ClassObject;
@@ -40,10 +36,10 @@
  * Used by StepControl to track a set of addresses associated with
  * a single line.
  */
-typedef struct AddressSet {
+struct AddressSet {
     u4 setSize;
     u1 set[1];
-} AddressSet;
+};
 
 INLINE void dvmAddressSetSet(AddressSet *pSet, u4 toSet)
 {
@@ -64,24 +60,24 @@
 /*
  * Single-step management.
  */
-typedef struct StepControl {
+struct StepControl {
     /* request */
-    enum JdwpStepSize   size;
-    enum JdwpStepDepth  depth;
-    struct Thread*      thread;         /* don't deref; for comparison only */
+    JdwpStepSize size;
+    JdwpStepDepth depth;
+    Thread* thread;         /* don't deref; for comparison only */
 
     /* current state */
-    bool                active;
-    const struct Method* method;
-    int                 line;           /* line #; could be -1 */
-    const AddressSet*   pAddressSet;    /* if non-null, address set for line */
-    int                 frameDepth;
-} StepControl;
+    bool active;
+    const Method* method;
+    int line;           /* line #; could be -1 */
+    const AddressSet* pAddressSet;    /* if non-null, address set for line */
+    int frameDepth;
+};
 
 /*
  * Invoke-during-breakpoint support.
  */
-typedef struct DebugInvokeReq {
+struct DebugInvokeReq {
     /* boolean; only set when we're in the tail end of an event handler */
     bool ready;
 
@@ -89,24 +85,24 @@
     bool invokeNeeded;
 
     /* request */
-    struct Object*      obj;        /* not used for ClassType.InvokeMethod */
-    struct Object*      thread;
-    struct ClassObject* clazz;
-    struct Method*      method;
-    u4                  numArgs;
-    u8*                 argArray;   /* will be NULL if numArgs==0 */
-    u4                  options;
+    Object* obj;        /* not used for ClassType.InvokeMethod */
+    Object* thread;
+    ClassObject* clazz;
+    Method* method;
+    u4 numArgs;
+    u8* argArray;   /* will be NULL if numArgs==0 */
+    u4 options;
 
     /* result */
-    JdwpError           err;
-    u1                  resultTag;
-    JValue              resultValue;
-    ObjectId            exceptObj;
+    JdwpError err;
+    u1 resultTag;
+    JValue resultValue;
+    ObjectId exceptObj;
 
     /* condition variable to wait on while the method executes */
-    pthread_mutex_t     lock;
-    pthread_cond_t      cv;
-} DebugInvokeReq;
+    pthread_mutex_t lock;
+    pthread_cond_t cv;
+};
 
 /* system init/shutdown */
 bool dvmDebuggerStartup(void);
@@ -264,14 +260,13 @@
 /*
  * Debugger notification
  */
-void dvmDbgPostLocationEvent(const struct Method* method, int pcOffset,
-    struct Object* thisPtr, int eventFlags);
+void dvmDbgPostLocationEvent(const Method* method, int pcOffset,
+    Object* thisPtr, int eventFlags);
 void dvmDbgPostException(void* throwFp, int throwRelPc, void* catchFp,
-    int catchRelPc, struct Object* exception);
-void dvmDbgPostThreadStart(struct Thread* thread);
-void dvmDbgPostThreadDeath(struct Thread* thread);
-void dvmDbgPostClassPrepare(struct ClassObject* clazz);
-// FieldAccess, FieldModification
+    int catchRelPc, Object* exception);
+void dvmDbgPostThreadStart(Thread* thread);
+void dvmDbgPostThreadDeath(Thread* thread);
+void dvmDbgPostClassPrepare(ClassObject* clazz);
 
 /* for "eventFlags" */
 enum {
@@ -283,8 +278,8 @@
 
 bool dvmDbgWatchLocation(const JdwpLocation* pLoc);
 void dvmDbgUnwatchLocation(const JdwpLocation* pLoc);
-bool dvmDbgConfigureStep(ObjectId threadId, enum JdwpStepSize size,
-    enum JdwpStepDepth depth);
+bool dvmDbgConfigureStep(ObjectId threadId, JdwpStepSize size,
+    JdwpStepDepth depth);
 void dvmDbgUnconfigureStep(ObjectId threadId);
 
 JdwpError dvmDbgInvokeMethod(ObjectId threadId, ObjectId objectId,
@@ -293,7 +288,7 @@
 void dvmDbgExecuteMethod(DebugInvokeReq* pReq);
 
 /* Make an AddressSet for a line, for single stepping */
-const AddressSet *dvmAddressSetForLine(const struct Method* method, int line);
+const AddressSet *dvmAddressSetForLine(const Method* method, int line);
 
 /* perform "late registration" of an object ID */
 void dvmDbgRegisterObjectId(ObjectId id);
@@ -311,8 +306,4 @@
 #define CHUNK_TYPE(_name) \
     ((_name)[0] << 24 | (_name)[1] << 16 | (_name)[2] << 8 | (_name)[3])
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_DEBUGGER*/
diff --git a/vm/DvmDex.h b/vm/DvmDex.h
index 937f09d..df14760 100644
--- a/vm/DvmDex.h
+++ b/vm/DvmDex.h
@@ -21,10 +21,6 @@
 #ifndef _DALVIK_DVMDEX
 #define _DALVIK_DVMDEX
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #include "libdex/DexFile.h"
 
 /* extern */
@@ -38,7 +34,7 @@
 /*
  * Some additional VM data structures that are associated with the DEX file.
  */
-typedef struct DvmDex {
+struct DvmDex {
     /* pointer to the DexFile we're associated with */
     DexFile*            pDexFile;
 
@@ -67,7 +63,7 @@
 
     /* lock ensuring mutual exclusion during updates */
     pthread_mutex_t     modLock;
-} DvmDex;
+};
 
 
 /*
@@ -162,8 +158,4 @@
     pDvmDex->pResFields[fieldIdx] = field;
 }
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_DVMDEX*/
diff --git a/vm/Exception.h b/vm/Exception.h
index 24c0eb4..81a0e76 100644
--- a/vm/Exception.h
+++ b/vm/Exception.h
@@ -20,10 +20,6 @@
 #ifndef _DALVIK_EXCEPTION
 #define _DALVIK_EXCEPTION
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Create a Throwable and throw an exception in the current thread (where
  * "throwing" just means "set the thread's exception pointer").
@@ -177,7 +173,7 @@
  * Returns the offset to the catch code on success, or -1 if we couldn't
  * find a catcher.
  */
-int dvmFindCatchBlock(Thread* self, int relPc, Object* exception,
+extern "C" int dvmFindCatchBlock(Thread* self, int relPc, Object* exception,
     bool doUnroll, void** newFrame);
 
 /*
@@ -216,21 +212,20 @@
  * Throw an ArithmeticException in the current thread, with the given detail
  * message.
  */
-void dvmThrowArithmeticException(const char* msg);
+extern "C" void dvmThrowArithmeticException(const char* msg);
 
 /*
  * Throw an ArrayIndexOutOfBoundsException in the current thread,
  * using the given array length and index in the detail message.
  */
-void dvmThrowArrayIndexOutOfBoundsException(int length, int index);
+extern "C" void dvmThrowArrayIndexOutOfBoundsException(int length, int index);
 
 /*
  * Throw an ArrayStoreException in the current thread, using the given classes'
  * names in the detail message, indicating that an object of the given type
  * can't be stored into an array of the given type.
  */
-void dvmThrowArrayStoreExceptionIncompatibleElement(ClassObject* objectType,
-        ClassObject* arrayType);
+extern "C" void dvmThrowArrayStoreExceptionIncompatibleElement(ClassObject* objectType, ClassObject* arrayType);
 
 /*
  * Throw an ArrayStoreException in the current thread, using the given
@@ -259,7 +254,7 @@
  * Throw a ClassCastException in the current thread, using the given classes'
  * names in the detail message.
  */
-void dvmThrowClassCastException(ClassObject* actual, ClassObject* desired);
+extern "C" void dvmThrowClassCastException(ClassObject* actual, ClassObject* desired);
 
 /**
  * Throw a ClassCircularityError in the current thread, with the
@@ -365,7 +360,7 @@
  * Throw an InternalError in the current thread, with the given
  * detail message.
  */
-void dvmThrowInternalError(const char* msg);
+extern "C" void dvmThrowInternalError(const char* msg);
 
 /**
  * Throw an InterruptedException in the current thread, with the given
@@ -383,13 +378,13 @@
  * Throw a NegativeArraySizeException in the current thread, with the
  * given number as the detail message.
  */
-void dvmThrowNegativeArraySizeException(s4 size);
+extern "C" void dvmThrowNegativeArraySizeException(s4 size);
 
 /**
  * Throw a NoClassDefFoundError in the current thread, with the
  * human-readable form of the given descriptor as the detail message.
  */
-void dvmThrowNoClassDefFoundError(const char* descriptor);
+extern "C" void dvmThrowNoClassDefFoundError(const char* descriptor);
 
 /**
  * Throw a NoClassDefFoundError in the current thread, with the given
@@ -403,7 +398,7 @@
  * Throw a NoSuchFieldError in the current thread, with the given
  * detail message.
  */
-void dvmThrowNoSuchFieldError(const char* msg);
+extern "C" void dvmThrowNoSuchFieldError(const char* msg);
 
 /**
  * Throw a NoSuchFieldException in the current thread, with the given
@@ -415,13 +410,13 @@
  * Throw a NoSuchMethodError in the current thread, with the given
  * detail message.
  */
-void dvmThrowNoSuchMethodError(const char* msg);
+extern "C" void dvmThrowNoSuchMethodError(const char* msg);
 
 /**
  * Throw a NullPointerException in the current thread, with the given
  * detail message.
  */
-void dvmThrowNullPointerException(const char* msg);
+extern "C" void dvmThrowNullPointerException(const char* msg);
 
 /**
  * Throw an OutOfMemoryError in the current thread, with the given
@@ -487,8 +482,4 @@
  */
 void dvmThrowVirtualMachineError(const char* msg);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_EXCEPTION*/
diff --git a/vm/Globals.h b/vm/Globals.h
index 6b5d786..db552c6 100644
--- a/vm/Globals.h
+++ b/vm/Globals.h
@@ -33,24 +33,20 @@
 #include <stdarg.h>
 #include <pthread.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* private structures */
-typedef struct GcHeap GcHeap;
-typedef struct BreakpointSet BreakpointSet;
-typedef struct InlineSub InlineSub;
+struct GcHeap;
+struct BreakpointSet;
+struct InlineSub;
 
 /*
  * One of these for each -ea/-da/-esa/-dsa on the command line.
  */
-typedef struct AssertionControl {
+struct AssertionControl {
     char*   pkgOrClass;         /* package/class string, or NULL for esa/dsa */
     int     pkgOrClassLen;      /* string length, for quick compare */
     bool    enable;             /* enable or disable */
     bool    isPackage;          /* string ended with "..."? */
-} AssertionControl;
+};
 
 /*
  * Register map generation mode.  Only applicable when generateRegisterMaps
@@ -62,11 +58,11 @@
  * maps, but allows type-precise GC.  "LivePrecise" is even slower and
  * requires additional heap during processing, but allows live-precise GC.
  */
-typedef enum {
+enum RegisterMapMode {
     kRegisterMapModeUnknown = 0,
     kRegisterMapModeTypePrecise,
     kRegisterMapModeLivePrecise
-} RegisterMapMode;
+};
 
 /*
  * All fields are initialized to zero.
@@ -723,25 +719,25 @@
 #if defined(WITH_JIT)
 
 /* Trace profiling modes.  Ordering matters - off states before on states */
-typedef enum TraceProfilingModes {
+enum TraceProfilingModes {
     kTraceProfilingDisabled = 0,      // Not profiling
     kTraceProfilingPeriodicOff = 1,   // Periodic profiling, off phase
     kTraceProfilingContinuous = 2,    // Always profiling
     kTraceProfilingPeriodicOn = 3     // Periodic profiling, on phase
-} TraceProfilingModes;
+};
 
 /*
  * Exiting the compiled code w/o chaining will incur overhead to look up the
  * target in the code cache which is extra work only when JIT is enabled. So
  * we want to monitor it closely to make sure we don't have performance bugs.
  */
-typedef enum NoChainExits {
+enum NoChainExits {
     kInlineCacheMiss = 0,
     kCallsiteInterpreted,
     kSwitchOverflow,
     kHeavyweightMonitor,
     kNoChainExitLast,
-} NoChainExits;
+};
 
 /*
  * JIT-specific global state
@@ -968,8 +964,4 @@
 
 extern struct DvmJniGlobals gDvmJni;
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_GLOBALS*/
diff --git a/vm/Hash.h b/vm/Hash.h
index 2c6bd5e..12af8a7 100644
--- a/vm/Hash.h
+++ b/vm/Hash.h
@@ -22,10 +22,6 @@
 #ifndef _DALVIK_HASH
 #define _DALVIK_HASH
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* compute the hash of an item with a specific type */
 typedef u4 (*HashCompute)(const void* item);
 
@@ -62,10 +58,10 @@
  *
  * When an entry is released, we will call (HashFreeFunc)(entry->data).
  */
-typedef struct HashEntry {
+struct HashEntry {
     u4 hashValue;
     void* data;
-} HashEntry;
+};
 
 #define HASH_TOMBSTONE ((void*) 0xcbcacccd)     // invalid ptr value
 
@@ -74,14 +70,14 @@
  *
  * This structure should be considered opaque.
  */
-typedef struct HashTable {
+struct HashTable {
     int         tableSize;          /* must be power of 2 */
     int         numEntries;         /* current #of "live" entries */
     int         numDeadEntries;     /* current #of tombstone entries */
     HashEntry*  pEntries;           /* array on heap */
     HashFreeFunc freeFunc;
     pthread_mutex_t lock;
-} HashTable;
+};
 
 /*
  * Create and initialize a HashTable structure, using "initialSize" as
@@ -183,11 +179,11 @@
  *       MyData* data = (MyData*)dvmHashIterData(&iter);
  *   }
  */
-typedef struct HashIter {
+struct HashIter {
     void*       data;
     HashTable*  pHashTable;
     int         idx;
-} HashIter;
+};
 INLINE void dvmHashIterNext(HashIter* pIter) {
     int i = pIter->idx +1;
     int lim = pIter->pHashTable->tableSize;
@@ -222,8 +218,4 @@
 void dvmHashTableProbeCount(HashTable* pHashTable, HashCalcFunc calcFunc,
     HashCompareFunc cmpFunc);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_HASH*/
diff --git a/vm/IndirectRefTable.h b/vm/IndirectRefTable.h
index 36d18ba..165bfb1 100644
--- a/vm/IndirectRefTable.h
+++ b/vm/IndirectRefTable.h
@@ -17,10 +17,6 @@
 #ifndef _DALVIK_INDIRECTREFTABLE
 #define _DALVIK_INDIRECTREFTABLE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Maintain a table of indirect references.  Used for local/global JNI
  * references.
@@ -95,22 +91,22 @@
  *
  * For convenience these match up with enum jobjectRefType from jni.h.
  */
-typedef enum IndirectRefKind {
+enum IndirectRefKind {
     kIndirectKindInvalid    = 0,
     kIndirectKindLocal      = 1,
     kIndirectKindGlobal     = 2,
     kIndirectKindWeakGlobal = 3
-} IndirectRefKind;
+};
 
 /*
  * Extended debugging structure.  We keep a parallel array of these, one
  * per slot in the table.
  */
 #define kIRTPrevCount   4
-typedef struct IndirectRefSlot {
+struct IndirectRefSlot {
     u4          serial;         /* slot serial */
     Object*     previous[kIRTPrevCount];
-} IndirectRefSlot;
+};
 
 /*
  * Table definition.
@@ -179,14 +175,14 @@
  * add a "synchronized lookup" call that takes the mutex as an argument,
  * and either locks or doesn't lock based on internal details.
  */
-typedef union IRTSegmentState {
+union IRTSegmentState {
     u4          all;
     struct {
         u4      topIndex:16;            /* index of first unused entry */
         u4      numHoles:16;            /* #of holes in entire table */
     } parts;
-} IRTSegmentState;
-typedef struct IndirectRefTable {
+};
+struct IndirectRefTable {
     /* semi-public - read/write by interpreter in native call handler */
     IRTSegmentState segmentState;
 
@@ -201,7 +197,7 @@
 
     // TODO: want hole-filling stats (#of holes filled, total entries scanned)
     //       for performance evaluation.
-} IndirectRefTable;
+};
 
 /* use as initial value for "cookie", and when table has only one segment */
 #define IRT_FIRST_SEGMENT   0
@@ -394,8 +390,4 @@
  */
 void dvmDumpIndirectRefTable(const IndirectRefTable* pRef, const char* descr);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_INDIRECTREFTABLE*/
diff --git a/vm/Init.h b/vm/Init.h
index 7e91217..4d85c2e 100644
--- a/vm/Init.h
+++ b/vm/Init.h
@@ -20,10 +20,6 @@
 #ifndef _DALVIK_INIT
 #define _DALVIK_INIT
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Standard VM initialization, usually invoked through JNI.
  */
@@ -73,8 +69,4 @@
 #endif
     ;
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_INIT*/
diff --git a/vm/InlineNative.cpp b/vm/InlineNative.cpp
index 8e538cc..f4f4e8c 100644
--- a/vm/InlineNative.cpp
+++ b/vm/InlineNative.cpp
@@ -511,16 +511,16 @@
  * ===========================================================================
  */
 
-typedef union {
+union Convert32 {
     u4 arg;
     float ff;
-} Convert32;
+};
 
-typedef union {
+union Convert64 {
     u4 arg[2];
     s8 ll;
     double dd;
-} Convert64;
+};
 
 /*
  * public static int abs(int)
diff --git a/vm/InlineNative.h b/vm/InlineNative.h
index bf08412..64caec9 100644
--- a/vm/InlineNative.h
+++ b/vm/InlineNative.h
@@ -20,10 +20,6 @@
 #ifndef _DALVIK_INLINENATIVE
 #define _DALVIK_INLINENATIVE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* startup/shutdown */
 bool dvmInlineNativeStartup(void);
 void dvmInlineNativeShutdown(void);
@@ -49,19 +45,19 @@
  * generate assembly code that knows how many args it needs and has the
  * target address embedded.
  */
-typedef struct InlineOperation {
+struct InlineOperation {
     InlineOp4Func   func;               /* MUST be first entry */
     const char*     classDescriptor;
     const char*     methodName;
     const char*     methodSignature;
-} InlineOperation;
+};
 
 /*
  * Must be kept in sync w/ gDvmInlineOpsTable in InlineNative.c
  *
  * You should also add a test to libcore's IntrinsicTest.
  */
-typedef enum NativeInlineOps {
+enum NativeInlineOps {
     INLINE_EMPTYINLINEMETHOD = 0,
     INLINE_STRING_CHARAT = 1,
     INLINE_STRING_COMPARETO = 2,
@@ -84,7 +80,7 @@
     INLINE_DOUBLE_TO_LONG_BITS = 19,
     INLINE_DOUBLE_TO_RAW_LONG_BITS = 20,
     INLINE_LONG_BITS_TO_DOUBLE = 21,
-} NativeInlineOps;
+};
 
 /*
  * Get the inlineops table.
@@ -123,7 +119,7 @@
 /*
  * Return method & populate the table on first use.
  */
-Method* dvmResolveInlineNative(int opIndex);
+extern "C" Method* dvmResolveInlineNative(int opIndex);
 
 /*
  * The actual inline native definitions.
@@ -194,8 +190,4 @@
 bool javaLangDouble_longBitsToDouble(u4 arg0, u4 arg1, u4 arg2, u4 arg,
                                      JValue* pResult);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_INLINENATIVE*/
diff --git a/vm/Intern.h b/vm/Intern.h
index b6e669a..6630b69 100644
--- a/vm/Intern.h
+++ b/vm/Intern.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_INTERN
 #define _DALVIK_INTERN
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 bool dvmStringInternStartup(void);
 void dvmStringInternShutdown(void);
 StringObject* dvmLookupInternedString(StringObject* strObj);
@@ -30,8 +26,4 @@
 bool dvmIsWeakInternedString(const StringObject* strObj);
 void dvmGcDetachDeadInternedStrings(int (*isUnmarkedObject)(void *));
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_INTERN*/
diff --git a/vm/JarFile.h b/vm/JarFile.h
index 0569ee2..e199951 100644
--- a/vm/JarFile.h
+++ b/vm/JarFile.h
@@ -19,20 +19,16 @@
 #ifndef _DALVIK_JARFILE
 #define _DALVIK_JARFILE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * This represents an open, scanned Jar file.  (It's actually for any Zip
  * archive that happens to hold a Dex file.)
  */
-typedef struct JarFile {
+struct JarFile {
     ZipArchive  archive;
     //MemMapping  map;
     char*       cacheFileName;
     DvmDex*     pDvmDex;
-} JarFile;
+};
 
 /*
  * Open the Zip archive and get a list of the classfile entries.
@@ -58,13 +54,13 @@
     return pJarFile->cacheFileName;
 }
 
-typedef enum DexCacheStatus {
+enum DexCacheStatus {
     DEX_CACHE_ERROR = -2,
     DEX_CACHE_BAD_ARCHIVE = -1,
     DEX_CACHE_OK = 0,
     DEX_CACHE_STALE,
     DEX_CACHE_STALE_ODEX,
-} DexCacheStatus;
+};
 
 /*
  * Checks the dependencies of the dex cache file corresponding
@@ -72,8 +68,4 @@
  */
 DexCacheStatus dvmDexCacheStatus(const char *fileName);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_JARFILE*/
diff --git a/vm/JniInternal.h b/vm/JniInternal.h
index 173583d..9412ab8 100644
--- a/vm/JniInternal.h
+++ b/vm/JniInternal.h
@@ -21,10 +21,6 @@
 
 #include "jni.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* system init/shutdown */
 bool dvmJniStartup(void);
 void dvmJniShutdown(void);
@@ -36,7 +32,7 @@
  */
 struct JavaVMExt;
 
-typedef struct JNIEnvExt {
+struct JNIEnvExt {
     const struct JNINativeInterface* funcTable;     /* must be first */
 
     const struct JNINativeInterface* baseFuncTable;
@@ -49,9 +45,9 @@
 
     struct JNIEnvExt* prev;
     struct JNIEnvExt* next;
-} JNIEnvExt;
+};
 
-typedef struct JavaVMExt {
+struct JavaVMExt {
     const struct JNIInvokeInterface* funcTable;     /* must be first */
 
     const struct JNIInvokeInterface* baseFuncTable;
@@ -59,7 +55,7 @@
     /* head of list of JNIEnvs associated with this VM */
     JNIEnvExt*      envList;
     pthread_mutex_t envListLock;
-} JavaVMExt;
+};
 
 /*
  * Native function return type; used by dvmPlatformInvoke().
@@ -68,7 +64,7 @@
  * Note: Assembly code in arch/<arch>/Call<arch>.S relies on
  * the enum values defined here.
  */
-typedef enum DalvikJniReturnType {
+enum DalvikJniReturnType {
     DALVIK_JNI_RETURN_VOID = 0,     /* must be zero */
     DALVIK_JNI_RETURN_FLOAT = 1,
     DALVIK_JNI_RETURN_DOUBLE = 2,
@@ -77,7 +73,7 @@
     DALVIK_JNI_RETURN_S2 = 5,
     DALVIK_JNI_RETURN_U2 = 6,
     DALVIK_JNI_RETURN_S1 = 7
-} DalvikJniReturnType;
+};
 
 #define DALVIK_JNI_NO_ARG_INFO  0x80000000
 #define DALVIK_JNI_RETURN_MASK  0x70000000
@@ -188,8 +184,4 @@
  */
 void dvmDumpJniReferenceTables(void);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_JNIINTERNAL*/
diff --git a/vm/LinearAlloc.h b/vm/LinearAlloc.h
index c06d2ab..3305e5b 100644
--- a/vm/LinearAlloc.h
+++ b/vm/LinearAlloc.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_LINEARALLOC
 #define _DALVIK_LINEARALLOC
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * If this is set, we create additional data structures and make many
  * additional mprotect() calls.
@@ -34,7 +30,7 @@
  * allocated region, but that would prevent us from sharing the rest of
  * that first page.
  */
-typedef struct LinearAllocHdr {
+struct LinearAllocHdr {
     int     curOffset;          /* offset where next data goes */
     pthread_mutex_t lock;       /* controls updates to this struct */
 
@@ -43,7 +39,7 @@
     int     firstOffset;        /* for chasing through */
 
     short*  writeRefCount;      /* for ENFORCE_READ_ONLY */
-} LinearAllocHdr;
+};
 
 
 /*
@@ -121,8 +117,4 @@
  */
 bool dvmLinearAllocContains(const void* start, size_t length);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_LINEARALLOC*/
diff --git a/vm/Misc.h b/vm/Misc.h
index c1ab72c..6bce241 100644
--- a/vm/Misc.h
+++ b/vm/Misc.h
@@ -25,10 +25,6 @@
 #include <sys/time.h>
 #include "Inlines.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Used to shut up the compiler when a parameter isn't used.
  */
@@ -67,7 +63,7 @@
  *
  * If "tag" is NULL the default tag ("dalvikvm") will be used.
  */
-typedef enum { kHexDumpLocal, kHexDumpMem } HexDumpMode;
+enum HexDumpMode { kHexDumpLocal, kHexDumpMem };
 void dvmPrintHexDumpEx(int priority, const char* tag, const void* vaddr,
     size_t length, HexDumpMode mode);
 
@@ -90,17 +86,17 @@
 #endif
 }
 
-typedef enum {
+enum DebugTargetKind {
     kDebugTargetUnknown = 0,
     kDebugTargetLog,
     kDebugTargetFile,
-} DebugTargetKind;
+};
 
 /*
  * We pass one of these around when we want code to be able to write debug
  * info to either the log or to a file (or stdout/stderr).
  */
-typedef struct DebugOutputTarget {
+struct DebugOutputTarget {
     /* where to? */
     DebugTargetKind which;
 
@@ -114,7 +110,7 @@
             FILE* fp;
         } file;
     } data;
-} DebugOutputTarget;
+};
 
 /*
  * Fill in a DebugOutputTarget struct.
@@ -145,7 +141,7 @@
  * of 'descriptor'. So "I" would be "int", "[[I" would be "int[][]",
  * "[Ljava/lang/String;" would be "java.lang.String[]", and so forth.
  */
-char* dvmHumanReadableDescriptor(const char* descriptor);
+extern "C" char* dvmHumanReadableDescriptor(const char* descriptor);
 
 /*
  * Return a newly-allocated string for the "dot version" of the class
@@ -260,7 +256,7 @@
  * get from the abort may point at the wrong call site.  Best to leave
  * it undecorated.
  */
-void dvmAbort(void);
+extern "C" void dvmAbort(void);
 void dvmPrintNativeBackTrace(void);
 
 #if (!HAVE_STRLCPY)
@@ -278,11 +274,11 @@
 /*
  * Get some per-thread stats from /proc/self/task/N/stat.
  */
-typedef struct {
+struct ProcStatData {
     unsigned long utime;    /* number of jiffies scheduled in user mode */
     unsigned long stime;    /* number of jiffies scheduled in kernel mode */
     int processor;          /* number of CPU that last executed thread */
-} ProcStatData;
+};
 bool dvmGetThreadStats(ProcStatData* pData, pid_t tid);
 
 /*
@@ -304,8 +300,4 @@
  */
 const char* dvmPathToAbsolutePortion(const char* path);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_MISC*/
diff --git a/vm/Native.cpp b/vm/Native.cpp
index 7d7980b..bbb4ce6 100644
--- a/vm/Native.cpp
+++ b/vm/Native.cpp
@@ -137,17 +137,17 @@
 // are associated with it.  (Or not -- can't determine if native code
 // is still using parts of it.)
 
-typedef enum OnLoadState {
+enum OnLoadState {
     kOnLoadPending = 0,     /* initial state, must be zero */
     kOnLoadFailed,
     kOnLoadOkay,
-} OnLoadState;
+};
 
 /*
  * We add one of these to the hash table for every library we load.  The
  * hash is on the "pathName" field.
  */
-typedef struct SharedLib {
+struct SharedLib {
     char*       pathName;           /* absolute path to library */
     void*       handle;             /* from dlopen */
     Object*     classLoader;        /* ClassLoader we are associated with */
@@ -156,7 +156,7 @@
     pthread_cond_t  onLoadCond;     /* wait for JNI_OnLoad in other thread */
     u4              onLoadThreadId; /* recursive invocation guard */
     OnLoadState     onLoadResult;   /* result of earlier JNI_OnLoad */
-} SharedLib;
+};
 
 /*
  * (This is a dvmHashTableLookup callback.)
diff --git a/vm/Native.h b/vm/Native.h
index 7599bcc..eb2b84a 100644
--- a/vm/Native.h
+++ b/vm/Native.h
@@ -22,27 +22,23 @@
 #ifndef _DALVIK_NATIVE
 #define _DALVIK_NATIVE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Method description; equivalent to a JNI struct.
  */
-typedef struct DalvikNativeMethod {
+struct DalvikNativeMethod {
     const char* name;
     const char* signature;
     DalvikNativeFunc  fnPtr;
-} DalvikNativeMethod;
+};
 
 /*
  * All methods for one class.  The last "methodInfo" has a NULL "name".
  */
-typedef struct DalvikNativeClass {
+struct DalvikNativeClass {
     const char* classDescriptor;
     const DalvikNativeMethod* methodInfo;
     u4          classDescriptorHash;          /* initialized at runtime */
-} DalvikNativeClass;
+};
 
 
 /* init/shutdown */
@@ -53,8 +49,8 @@
 /*
  * Convert argc/argv into a function call.  This is platform-specific.
  */
-void dvmPlatformInvoke(void* pEnv, ClassObject* clazz, int argInfo, int argc,
-    const u4* argv, const char* signature, void* func, JValue* pResult);
+extern "C" void dvmPlatformInvoke(void* pEnv, ClassObject* clazz, int argInfo,
+    int argc, const u4* argv, const char* signature, void* func, JValue* pResult);
 
 /*
  * Generate hints to speed native calls.  This is platform specific.
@@ -123,8 +119,4 @@
 void dvmLogNativeMethodExit(const Method* method, struct Thread* self,
         const JValue retval);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_NATIVE*/
diff --git a/vm/PointerSet.h b/vm/PointerSet.h
index 6e43f67..ddc5532 100644
--- a/vm/PointerSet.h
+++ b/vm/PointerSet.h
@@ -20,12 +20,7 @@
 #ifndef _DALVIK_POINTERSET
 #define _DALVIK_POINTERSET
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 struct PointerSet;   /* private */
-typedef struct PointerSet PointerSet;
 
 /*
  * Allocate a new PointerSet.
@@ -96,8 +91,4 @@
  */
 void dvmPointerSetDump(const PointerSet* pSet);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_POINTERSET*/
diff --git a/vm/Profile.h b/vm/Profile.h
index 12063b9..27d7c89 100644
--- a/vm/Profile.h
+++ b/vm/Profile.h
@@ -24,10 +24,6 @@
 
 #include <stdio.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 struct Thread;      // extern
 
 
@@ -39,7 +35,7 @@
  * Method trace state.  This is currently global.  In theory we could make
  * most of this per-thread.
  */
-typedef struct MethodTraceState {
+struct MethodTraceState {
     /* active state */
     pthread_mutex_t startStopLock;
     pthread_cond_t  threadExitCond;
@@ -53,7 +49,7 @@
     volatile int curOffset;
     u8      startWhen;
     int     overflow;
-} MethodTraceState;
+};
 
 /*
  * Memory allocation profiler state.  This is used both globally and
@@ -61,7 +57,7 @@
  *
  * If you add a field here, zero it out in dvmStartAllocCounting().
  */
-typedef struct AllocProfState {
+struct AllocProfState {
     bool    enabled;            // is allocation tracking enabled?
 
     int     allocCount;         // #of objects allocated
@@ -77,7 +73,7 @@
 
     int     classInitCount;     // #of initialized classes
     u8      classInitTime;      // cumulative time spent in class init (nsec)
-} AllocProfState;
+};
 
 
 /*
@@ -141,9 +137,9 @@
 void dvmMethodTraceClassPrepBegin(void);
 void dvmMethodTraceClassPrepEnd(void);
 
-void dvmFastMethodTraceEnter(const Method* method, struct Thread* self);
-void dvmFastMethodTraceExit(struct Thread* self);
-void dvmFastNativeMethodTraceExit(const Method* method, struct Thread* self);
+extern "C" void dvmFastMethodTraceEnter(const Method* method, struct Thread* self);
+extern "C" void dvmFastMethodTraceExit(struct Thread* self);
+extern "C" void dvmFastNativeMethodTraceExit(const Method* method, struct Thread* self);
 
 /*
  * Start/stop alloc counting.
@@ -175,8 +171,4 @@
 #define METHOD_ACTION(_method)  (((unsigned int)(_method)) & METHOD_ACTION_MASK)
 #define METHOD_COMBINE(_method, _action)    ((_method) | (_action))
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_PROFILE*/
diff --git a/vm/Properties.h b/vm/Properties.h
index 6226d7f..138be41 100644
--- a/vm/Properties.h
+++ b/vm/Properties.h
@@ -19,18 +19,10 @@
 #ifndef _DALVIK_PROPERTIES
 #define _DALVIK_PROPERTIES
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Initialization.
  */
 bool dvmPropertiesStartup(void);
 void dvmPropertiesShutdown(void);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_PROPERTIES*/
diff --git a/vm/RawDexFile.h b/vm/RawDexFile.h
index f2c1b68..ba777bb 100644
--- a/vm/RawDexFile.h
+++ b/vm/RawDexFile.h
@@ -21,18 +21,14 @@
 #ifndef _DALVIK_RAWDEXFILE
 #define _DALVIK_RAWDEXFILE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Structure representing a "raw" DEX file, in its unswapped unoptimized
  * state.
  */
-typedef struct RawDexFile {
+struct RawDexFile {
     char*       cacheFileName;
     DvmDex*     pDvmDex;
-} RawDexFile;
+};
 
 /*
  * Open a raw ".dex" file, optimize it, and load it.
@@ -72,8 +68,4 @@
     return pRawDexFile->cacheFileName;
 }
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_RAWDEXFILE*/
diff --git a/vm/ReferenceTable.h b/vm/ReferenceTable.h
index ce7c1f7..db2389f 100644
--- a/vm/ReferenceTable.h
+++ b/vm/ReferenceTable.h
@@ -23,10 +23,6 @@
 #ifndef _DALVIK_REFERENCETABLE
 #define _DALVIK_REFERENCETABLE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Table definition.
  *
@@ -40,13 +36,13 @@
  * (This structure is still somewhat transparent; direct access to
  * table/nextEntry is allowed.)
  */
-typedef struct ReferenceTable {
+struct ReferenceTable {
     Object**        nextEntry;          /* top of the list */
     Object**        table;              /* bottom of the list */
 
     int             allocEntries;       /* #of entries we have space for */
     int             maxEntries;         /* max #of entries allowed */
-} ReferenceTable;
+};
 
 /*
  * Initialize a ReferenceTable.
@@ -126,8 +122,4 @@
 void dvmDumpReferenceTableContents(Object* const* refs, size_t count,
     const char* descr);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_REFERENCETABLE*/
diff --git a/vm/SignalCatcher.h b/vm/SignalCatcher.h
index f9e1dd7..ece052c 100644
--- a/vm/SignalCatcher.h
+++ b/vm/SignalCatcher.h
@@ -19,15 +19,7 @@
 #ifndef _DALVIK_SIGNALCATCHER
 #define _DALVIK_SIGNALCATCHER
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 bool dvmSignalCatcherStartup(void);
 void dvmSignalCatcherShutdown(void);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_SIGNALCATCHER*/
diff --git a/vm/StdioConverter.cpp b/vm/StdioConverter.cpp
index 7776688..a98d473 100644
--- a/vm/StdioConverter.cpp
+++ b/vm/StdioConverter.cpp
@@ -30,20 +30,20 @@
 /*
  * Hold our replacement stdout/stderr.
  */
-typedef struct StdPipes {
+struct StdPipes {
     int stdoutPipe[2];
     int stderrPipe[2];
-} StdPipes;
+};
 
 #define kMaxLine    512
 
 /*
  * Hold some data.
  */
-typedef struct BufferedData {
+struct BufferedData {
     char    buf[kMaxLine+1];
     int     count;
-} BufferedData;
+};
 
 // fwd
 static void* stdioConverterThreadStart(void* arg);
diff --git a/vm/StdioConverter.h b/vm/StdioConverter.h
index 37384eb..ffbf807 100644
--- a/vm/StdioConverter.h
+++ b/vm/StdioConverter.h
@@ -19,15 +19,7 @@
 #ifndef _DALVIK_STDOUTCONVERTER
 #define _DALVIK_STDOUTCONVERTER
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 bool dvmStdioConverterStartup(void);
 void dvmStdioConverterShutdown(void);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_STDOUTCONVERTER*/
diff --git a/vm/Sync.h b/vm/Sync.h
index 9f4592d..14b34fd 100644
--- a/vm/Sync.h
+++ b/vm/Sync.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_SYNC
 #define _DALVIK_SYNC
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Monitor shape field.  Used to distinguish immediate thin locks from
  * indirecting fat locks.
@@ -70,7 +66,6 @@
 struct Object;
 struct Monitor;
 struct Thread;
-typedef struct Monitor Monitor;
 
 /*
  * Returns true if the lock has been fattened.
@@ -80,25 +75,25 @@
 /*
  * Acquire the object's monitor.
  */
-void dvmLockObject(struct Thread* self, struct Object* obj);
+extern "C" void dvmLockObject(Thread* self, Object* obj);
 
 /* Returns true if the unlock succeeded.
  * If the unlock failed, an exception will be pending.
  */
-bool dvmUnlockObject(struct Thread* self, struct Object* obj);
+extern "C" bool dvmUnlockObject(Thread* self, Object* obj);
 
 /*
  * Implementations of some java/lang/Object calls.
  */
-void dvmObjectWait(struct Thread* self, struct Object* obj,
+void dvmObjectWait(Thread* self, Object* obj,
     s8 timeout, s4 nanos, bool interruptShouldThrow);
-void dvmObjectNotify(struct Thread* self, struct Object* obj);
-void dvmObjectNotifyAll(struct Thread* self, struct Object* obj);
+void dvmObjectNotify(Thread* self, Object* obj);
+void dvmObjectNotifyAll(Thread* self, Object* obj);
 
 /*
  * Implementation of System.identityHashCode().
  */
-u4 dvmIdentityHashCode(struct Object* obj);
+u4 dvmIdentityHashCode(Object* obj);
 
 /*
  * Implementation of Thread.sleep().
@@ -110,10 +105,10 @@
  *
  * Interrupt a thread.  If it's waiting on a monitor, wake it up.
  */
-void dvmThreadInterrupt(struct Thread* thread);
+void dvmThreadInterrupt(Thread* thread);
 
 /* create a new Monitor struct */
-Monitor* dvmCreateMonitor(struct Object* obj);
+Monitor* dvmCreateMonitor(Object* obj);
 
 /*
  * Frees unmarked monitors from the monitor list.  The given callback
@@ -131,7 +126,7 @@
  * Returns NULL if "mon" is NULL or the monitor is not part of an object
  * (which should only happen for Thread.sleep() in the current implementation).
  */
-struct Object* dvmGetMonitorObject(Monitor* mon);
+Object* dvmGetMonitorObject(Monitor* mon);
 
 /*
  * Get the thread that holds the lock on the specified object.  The
@@ -139,12 +134,12 @@
  *
  * The caller must lock the thread list before calling here.
  */
-struct Thread* dvmGetObjectLockHolder(struct Object* obj);
+Thread* dvmGetObjectLockHolder(Object* obj);
 
 /*
  * Checks whether the object is held by the specified thread.
  */
-bool dvmHoldsLock(struct Thread* thread, struct Object* obj);
+bool dvmHoldsLock(Thread* thread, Object* obj);
 
 /*
  * Relative timed wait on condition
@@ -152,8 +147,4 @@
 int dvmRelativeCondWait(pthread_cond_t* cond, pthread_mutex_t* mutex,
                          s8 msec, s4 nsec);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_SYNC*/
diff --git a/vm/Thread.h b/vm/Thread.h
index 440dfe3..2f0a29d 100644
--- a/vm/Thread.h
+++ b/vm/Thread.h
@@ -26,10 +26,6 @@
 #include <errno.h>
 #include <cutils/sched_policy.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #if defined(CHECK_MUTEX) && !defined(__USE_UNIX98)
 /* glibc lacks this unless you #define __USE_UNIX98 */
 int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
@@ -43,7 +39,7 @@
  *
  * Note that "suspended" is orthogonal to these values (so says JDWP).
  */
-typedef enum ThreadStatus {
+enum ThreadStatus {
     THREAD_UNDEFINED    = -1,       /* makes enum compatible with int32_t */
 
     /* these match up with JDWP values */
@@ -58,7 +54,7 @@
     THREAD_NATIVE       = 7,        /* off in a JNI native method */
     THREAD_VMWAIT       = 8,        /* waiting on a VM resource */
     THREAD_SUSPENDED    = 9,        /* suspended, usually by GC or debugger */
-} ThreadStatus;
+};
 
 /* thread priorities, from java.lang.Thread */
 enum {
@@ -87,7 +83,7 @@
  * Interpreter control struction.  Packed into a long long to enable
  * atomic updates.
  */
-typedef union InterpBreak {
+union InterpBreak {
     volatile int64_t   all;
     struct {
         uint16_t   subMode;
@@ -99,14 +95,14 @@
         void* unused;
 #endif
     } ctl;
-} InterpBreak;
+};
 
 /*
  * Our per-thread data.
  *
  * These are allocated on the system heap.
  */
-typedef struct Thread {
+struct Thread {
     /*
      * Interpreter state which must be preserved across nested
      * interpreter invocations (via JNI callbacks).  Must be the first
@@ -308,13 +304,13 @@
     pthread_mutex_t   callbackMutex;
     SafePointCallback callback;
     void*             callbackArg;
-} Thread;
+};
 
 /* start point for an internal thread; mimics pthread args */
 typedef void* (*InternalThreadStart)(void* arg);
 
 /* args for internal thread creation */
-typedef struct InternalStartArgs {
+struct InternalStartArgs {
     /* inputs */
     InternalThreadStart func;
     void*       funcArg;
@@ -324,7 +320,7 @@
     /* result */
     volatile Thread** pThread;
     volatile int*     pCreateStatus;
-} InternalStartArgs;
+};
 
 /* finish init */
 bool dvmPrepMainForJni(JNIEnv* pEnv);
@@ -350,7 +346,7 @@
 /*
  * Thread suspend/resume, used by the GC and debugger.
  */
-typedef enum SuspendCause {
+enum SuspendCause {
     SUSPEND_NOT = 0,
     SUSPEND_FOR_GC,
     SUSPEND_FOR_DEBUG,
@@ -365,7 +361,7 @@
     SUSPEND_FOR_CC_RESET,    // code-cache reset
     SUSPEND_FOR_REFRESH,     // Reload data cached in interpState
 #endif
-} SuspendCause;
+};
 void dvmSuspendThread(Thread* thread);
 void dvmSuspendSelf(bool jdwpActivity);
 void dvmResumeThread(Thread* thread);
@@ -387,7 +383,7 @@
  * Check to see if we should be suspended now.  If so, suspend ourselves
  * by sleeping on a condition variable.
  */
-bool dvmCheckSuspendPending(Thread* self);
+extern "C" bool dvmCheckSuspendPending(Thread* self);
 
 /*
  * Fast test for use in the interpreter.  Returns "true" if our suspend
@@ -601,8 +597,4 @@
  */
 void dvmNukeThread(Thread* thread);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_THREAD*/
diff --git a/vm/UtfString.h b/vm/UtfString.h
index 6b9a5e3..b577d3a 100644
--- a/vm/UtfString.h
+++ b/vm/UtfString.h
@@ -21,10 +21,6 @@
 #ifndef _DALVIK_STRING
 #define _DALVIK_STRING
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * (This is private to UtfString.c, but we cheat a bit and also use it
  * for InlineNative.c.  Not really worth creating a separate header.)
@@ -149,8 +145,4 @@
  */
 int dvmHashcmpStrings(const void* vstrObj1, const void* vstrObj2);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_STRING*/
diff --git a/vm/alloc/Copying.cpp b/vm/alloc/Copying.cpp
index a1e503a..47df05f 100644
--- a/vm/alloc/Copying.cpp
+++ b/vm/alloc/Copying.cpp
@@ -527,7 +527,7 @@
     *gcHeap = NULL;
 }
 
-size_t dvmHeapSourceGetValue(enum HeapSourceValueSpec spec,
+size_t dvmHeapSourceGetValue(HeapSourceValueSpec spec,
                              size_t perHeapStats[],
                              size_t arrayLen)
 {
diff --git a/vm/alloc/HeapSource.cpp b/vm/alloc/HeapSource.cpp
index d944560..6666f88 100644
--- a/vm/alloc/HeapSource.cpp
+++ b/vm/alloc/HeapSource.cpp
@@ -652,7 +652,7 @@
  * Caller must hold the heap lock.
  */
 size_t
-dvmHeapSourceGetValue(enum HeapSourceValueSpec spec, size_t perHeapStats[],
+dvmHeapSourceGetValue(HeapSourceValueSpec spec, size_t perHeapStats[],
                       size_t arrayLen)
 {
     HeapSource *hs = gHs;
diff --git a/vm/analysis/CodeVerify.cpp b/vm/analysis/CodeVerify.cpp
index 2bf67d4..931569f 100644
--- a/vm/analysis/CodeVerify.cpp
+++ b/vm/analysis/CodeVerify.cpp
@@ -37,11 +37,11 @@
  * we either only need it at branch points (for verification) or GC points
  * and branches (for verification + type-precise register analysis).
  */
-typedef enum RegisterTrackingMode {
+enum RegisterTrackingMode {
     kTrackRegsBranches,
     kTrackRegsGcPoints,
     kTrackRegsAll
-} RegisterTrackingMode;
+};
 
 /*
  * Set this to enable dead code scanning.  This is not required, but it's
@@ -1820,12 +1820,12 @@
  * We treat object references separately, so we have "category1nr".  We
  * don't support jsr/ret, so there is no "returnAddress" type.
  */
-typedef enum TypeCategory {
+enum TypeCategory {
     kTypeCategoryUnknown = 0,
     kTypeCategory1nr,           // boolean, byte, char, short, int, float
     kTypeCategory2,             // long, double
     kTypeCategoryRef,           // object reference
-} TypeCategory;
+};
 
 /*
  * See if "type" matches "cat".  All we're really looking for here is that
diff --git a/vm/analysis/CodeVerify.h b/vm/analysis/CodeVerify.h
index 4fbf700..1eb27b9 100644
--- a/vm/analysis/CodeVerify.h
+++ b/vm/analysis/CodeVerify.h
@@ -23,10 +23,6 @@
 #include "analysis/VerifySubs.h"
 #include "analysis/VfyBasicBlock.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Enumeration for register type values.  The "hi" piece of a 64-bit value
  * MUST immediately follow the "lo" piece in the enumeration, so we can check
@@ -129,32 +125,32 @@
  * track the liveness of the method result register (which is not visible
  * to the GC).
  */
-typedef struct {
+struct RegisterLine {
     RegType*        regTypes;
     MonitorEntries* monitorEntries;
     u4*             monitorStack;
     unsigned int    monitorStackTop;
     BitVector*      liveRegs;
-} RegisterLine;
+};
 
 /*
  * Table that maps uninitialized instances to classes, based on the
  * address of the new-instance instruction.  One per method.
  */
-typedef struct UninitInstanceMap {
+struct UninitInstanceMap {
     int numEntries;
     struct {
         int             addr;   /* code offset, or -1 for method arg ("this") */
         ClassObject*    clazz;  /* class created at this address */
     } map[1];
-} UninitInstanceMap;
+};
 #define kUninitThisArgAddr  (-1)
 #define kUninitThisArgSlot  0
 
 /*
  * Various bits of data used by the verifier and register map generator.
  */
-typedef struct VerifierData {
+struct VerifierData {
     /*
      * The method we're working on.
      */
@@ -203,7 +199,7 @@
      * for liveness analysis.
      */
     VfyBasicBlock** basicBlocks;
-} VerifierData;
+};
 
 
 /* table with static merge logic for primitive types */
@@ -325,8 +321,4 @@
  */
 bool dvmVerifyCodeFlow(VerifierData* vdata);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_CODEVERIFY*/
diff --git a/vm/analysis/DexPrepare.h b/vm/analysis/DexPrepare.h
index 27668b1..9e43f26 100644
--- a/vm/analysis/DexPrepare.h
+++ b/vm/analysis/DexPrepare.h
@@ -20,10 +20,6 @@
 #ifndef _DALVIK_DEXPREPARE
 #define _DALVIK_DEXPREPARE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Global DEX optimizer control.  Determines the circumstances in which we
  * try to rewrite instructions in the DEX file.
@@ -31,13 +27,13 @@
  * Optimizing is performed ahead-of-time by dexopt and, in some cases, at
  * load time by the VM.
  */
-typedef enum DexOptimizerMode {
+enum DexOptimizerMode {
     OPTIMIZE_MODE_UNKNOWN = 0,
     OPTIMIZE_MODE_NONE,         /* never optimize (except "essential") */
     OPTIMIZE_MODE_VERIFIED,     /* only optimize verified classes (default) */
     OPTIMIZE_MODE_ALL,          /* optimize verified & unverified (risky) */
     OPTIMIZE_MODE_FULL          /* fully opt verified classes at load time */
-} DexOptimizerMode;
+};
 
 /* some additional bit flags for dexopt */
 enum DexoptFlags {
@@ -54,7 +50,7 @@
 /*
  * An enumeration of problems that can turn up during verification.
  */
-typedef enum VerifyError {
+enum VerifyError {
     VERIFY_ERROR_NONE = 0,      /* no error; must be zero */
     VERIFY_ERROR_GENERIC,       /* VerifyError */
 
@@ -66,7 +62,7 @@
     VERIFY_ERROR_ACCESS_METHOD, /* IllegalAccessError */
     VERIFY_ERROR_CLASS_CHANGE,  /* IncompatibleClassChangeError */
     VERIFY_ERROR_INSTANTIATION, /* InstantiationError */
-} VerifyError;
+};
 
 /*
  * Identifies the type of reference in the instruction that generated the
@@ -75,11 +71,11 @@
  *
  * This must fit in two bits.
  */
-typedef enum VerifyErrorRefType {
+enum VerifyErrorRefType {
     VERIFY_ERROR_REF_CLASS  = 0,
     VERIFY_ERROR_REF_FIELD  = 1,
     VERIFY_ERROR_REF_METHOD = 2,
-} VerifyErrorRefType;
+};
 
 #define kVerifyErrorRefTypeShift 6
 
@@ -138,8 +134,4 @@
 bool dvmCreateInlineSubsTable(void);
 void dvmFreeInlineSubsTable(void);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_DEXPREPARE*/
diff --git a/vm/analysis/DexVerify.h b/vm/analysis/DexVerify.h
index a990502..d98cee9 100644
--- a/vm/analysis/DexVerify.h
+++ b/vm/analysis/DexVerify.h
@@ -20,21 +20,30 @@
 #ifndef _DALVIK_DEXVERIFY
 #define _DALVIK_DEXVERIFY
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Global verification mode.  These must be in order from least verification
  * to most.  If we're using "exact GC", we may need to perform some of
  * the verification steps anyway.
  */
-typedef enum {
+enum DexClassVerifyMode {
     VERIFY_MODE_UNKNOWN = 0,
     VERIFY_MODE_NONE,
     VERIFY_MODE_REMOTE,
     VERIFY_MODE_ALL
-} DexClassVerifyMode;
+};
+
+/* some verifier counters, for debugging */
+struct VerifierStats {
+    size_t methodsExamined;    /* number of methods examined */
+    size_t monEnterMethods;    /* number of methods with monitor-enter */
+    size_t instrsExamined;     /* incr on first visit of instruction */
+    size_t instrsReexamined;   /* incr on each repeat visit of instruction */
+    size_t copyRegCount;       /* calls from updateRegisters->copyRegisters */
+    size_t mergeRegCount;      /* calls from updateRegisters->merge */
+    size_t mergeRegChanged;    /* calls from updateRegisters->merge, changed */
+    size_t uninitSearches;     /* times we've had to search the uninit table */
+    size_t biggestAlloc;       /* largest RegisterLine table alloc */
+};
 
 /*
  * Certain types of instructions can be GC points.  To support precise
@@ -54,21 +63,4 @@
  */
 void dvmFreeRegisterMap(RegisterMap* pMap);
 
-/* some verifier counters, for debugging */
-typedef struct {
-    size_t  methodsExamined;    /* number of methods examined */
-    size_t  monEnterMethods;    /* number of methods with monitor-enter */
-    size_t  instrsExamined;     /* incr on first visit of instruction */
-    size_t  instrsReexamined;   /* incr on each repeat visit of instruction */
-    size_t  copyRegCount;       /* calls from updateRegisters->copyRegisters */
-    size_t  mergeRegCount;      /* calls from updateRegisters->merge */
-    size_t  mergeRegChanged;    /* calls from updateRegisters->merge, changed */
-    size_t  uninitSearches;     /* times we've had to search the uninit table */
-    size_t  biggestAlloc;       /* largest RegisterLine table alloc */
-} VerifierStats;
-
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_DEXVERIFY*/
diff --git a/vm/analysis/Liveness.h b/vm/analysis/Liveness.h
index d9ca9cf..6436f66 100644
--- a/vm/analysis/Liveness.h
+++ b/vm/analysis/Liveness.h
@@ -20,16 +20,8 @@
 #ifndef _DALVIK_LIVENESS
 #define _DALVIK_LIVENESS
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 struct VerifierData;
 
 bool dvmComputeLiveness(struct VerifierData* vdata);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_LIVENESS*/
diff --git a/vm/analysis/Optimize.h b/vm/analysis/Optimize.h
index 9383881..75b6eab 100644
--- a/vm/analysis/Optimize.h
+++ b/vm/analysis/Optimize.h
@@ -20,10 +20,6 @@
 #ifndef _DALVIK_OPTIMIZE
 #define _DALVIK_OPTIMIZE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Entry point from DEX preparation.
  */
@@ -48,8 +44,4 @@
 StaticField* dvmOptResolveStaticField(ClassObject* referrer, u4 sfieldIdx,
     VerifyError* pFailure);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_OPTIMIZE*/
diff --git a/vm/analysis/RegisterMap.cpp b/vm/analysis/RegisterMap.cpp
index 54b5768..37b2116 100644
--- a/vm/analysis/RegisterMap.cpp
+++ b/vm/analysis/RegisterMap.cpp
@@ -58,7 +58,7 @@
 #define kUpdatePosnMinRegs  24
 #define kNumUpdatePosns     8
 #define kMaxDiffBits        20
-typedef struct MapStats {
+struct MapStats {
     /*
      * Buckets measuring the distance between GC points.  This tells us how
      * many bits we need to encode the advancing program counter.  We ignore
@@ -103,7 +103,7 @@
      */
     int numExpandedMaps;
     int totalExpandedMapSize;
-} MapStats;
+};
 #endif
 
 /*
diff --git a/vm/analysis/RegisterMap.h b/vm/analysis/RegisterMap.h
index becb1de..2f34c39 100644
--- a/vm/analysis/RegisterMap.h
+++ b/vm/analysis/RegisterMap.h
@@ -25,14 +25,10 @@
 #include "analysis/VerifySubs.h"
 #include "analysis/CodeVerify.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Format enumeration for RegisterMap data area.
  */
-typedef enum RegisterMapFormat {
+enum RegisterMapFormat {
     kRegMapFormatUnknown = 0,
     kRegMapFormatNone,          /* indicates no map data follows */
     kRegMapFormatCompact8,      /* compact layout, 8-bit addresses */
@@ -40,7 +36,7 @@
     kRegMapFormatDifferential,  /* compressed, differential encoding */
 
     kRegMapFormatOnHeap = 0x80, /* bit flag, indicates allocation on heap */
-} RegisterMapFormat;
+};
 
 /*
  * This is a single variable-size structure.  It may be allocated on the
@@ -163,12 +159,12 @@
  *
  * These structures are 32-bit aligned.
  */
-typedef struct RegisterMapMethodPool {
+struct RegisterMapMethodPool {
     u2      methodCount;            /* chiefly used as a sanity check */
 
     /* stream of per-method data starts here */
     u4      methodData[1];
-} RegisterMapMethodPool;
+};
 
 /*
  * Header for the memory-mapped RegisterMap pool in the DEX file.
@@ -181,12 +177,12 @@
  *
  * These structures are 32-bit aligned.
  */
-typedef struct RegisterMapClassPool {
+struct RegisterMapClassPool {
     u4      numClasses;
 
     /* offset table starts here, 32-bit aligned; offset==0 means no data */
     u4      classDataOffset[1];
-} RegisterMapClassPool;
+};
 
 /*
  * Find the register maps for this class.  (Used during class loading.)
@@ -213,14 +209,14 @@
  * In particular, it keeps track of our temporary mmap region so we can
  * free it later.
  */
-typedef struct RegisterMapBuilder {
+struct RegisterMapBuilder {
     /* public */
     void*       data;
     size_t      size;
 
     /* private */
     MemMapping  memMap;
-} RegisterMapBuilder;
+};
 
 /*
  * Generate a register map set for all verified classes in "pDvmDex".
@@ -267,8 +263,4 @@
 /* dump stats gathered during register map creation process */
 void dvmRegisterMapDumpStats(void);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_REGISTERMAP*/
diff --git a/vm/analysis/VerifySubs.h b/vm/analysis/VerifySubs.h
index 452355b..625244d 100644
--- a/vm/analysis/VerifySubs.h
+++ b/vm/analysis/VerifySubs.h
@@ -20,10 +20,6 @@
 #ifndef _DALVIK_VERIFYSUBS
 #define _DALVIK_VERIFYSUBS
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * InsnFlags is a 32-bit integer with the following layout:
  *   0-15  instruction length (or 0 if this address doesn't hold an opcode)
@@ -75,8 +71,4 @@
 /* debugging */
 bool dvmWantVerboseVerification(const Method* meth);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_VERIFYSUBS*/
diff --git a/vm/analysis/VfyBasicBlock.h b/vm/analysis/VfyBasicBlock.h
index f14953e..6d1d76f 100644
--- a/vm/analysis/VfyBasicBlock.h
+++ b/vm/analysis/VfyBasicBlock.h
@@ -23,10 +23,6 @@
 
 #include "PointerSet.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 struct VerifierData;
 
 
@@ -43,14 +39,14 @@
  * the RegisterLine for the last instruction in the block (which reflects
  * the state *before* the instruction has executed).
  */
-typedef struct {
+struct VfyBasicBlock {
     u4              firstAddr;      /* address of first instruction */
     u4              lastAddr;       /* address of last instruction */
     PointerSet*     predecessors;   /* set of basic blocks that can flow here */
     BitVector*      liveRegs;       /* liveness for each register */
     bool            changed;        /* input set has changed, must re-eval */
     bool            visited;        /* block has been visited at least once */
-} VfyBasicBlock;
+};
 
 /*
  * Generate a list of basic blocks.
@@ -62,8 +58,4 @@
  */
 void dvmFreeVfyBasicBlocks(struct VerifierData* vdata);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_VFYBASICBLOCK*/
diff --git a/vm/compiler/Compiler.h b/vm/compiler/Compiler.h
index 3ceb447..2cf2935 100644
--- a/vm/compiler/Compiler.h
+++ b/vm/compiler/Compiler.h
@@ -20,10 +20,6 @@
 #include <setjmp.h>
 #include "Thread.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Uncomment the following to enable JIT signature breakpoint
  * #define SIGNATURE_BREAKPOINT
@@ -241,13 +237,9 @@
 void dvmCompilerUpdateGlobalState(void);
 JitTraceDescription *dvmCopyTraceDescriptor(const u2 *pc,
                                             const struct JitEntry *desc);
-void *dvmCompilerGetInterpretTemplate();
+extern "C" void *dvmCompilerGetInterpretTemplate();
 JitInstructionSetType dvmCompilerGetInterpretTemplateSet();
 u8 dvmGetRegResourceMask(int reg);
 void dvmDumpCFG(struct CompilationUnit *cUnit, const char *dirPrefix);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* _DALVIK_VM_COMPILER */
diff --git a/vm/compiler/codegen/CompilerCodegen.h b/vm/compiler/codegen/CompilerCodegen.h
index 8223d2a..2e3b107 100644
--- a/vm/compiler/codegen/CompilerCodegen.h
+++ b/vm/compiler/codegen/CompilerCodegen.h
@@ -19,10 +19,6 @@
 
 #include "compiler/CompilerIR.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* Maximal number of switch cases to have inline chains */
 #define MAX_CHAINED_SWITCH_CASES 64
 
@@ -39,7 +35,7 @@
 void dvmCompilerAssembleLIR(CompilationUnit *cUnit, JitTranslationInfo *info);
 
 /* Perform translation chain operation. */
-void* dvmJitChain(void* tgtAddr, u4* branchAddr);
+extern "C" void* dvmJitChain(void* tgtAddr, u4* branchAddr);
 
 /* Install class objects in the literal pool */
 void dvmJitInstallClassObjectPointers(CompilationUnit *cUnit,
@@ -75,8 +71,4 @@
 /* Implemented in codegen/<target>/<target_variant>/ArchVariant.c */
 void dvmCompilerGenMemBarrier(CompilationUnit *cUnit, int barrierKind);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* _DALVIK_VM_COMPILERCODEGEN_H_ */
diff --git a/vm/compiler/codegen/Optimizer.h b/vm/compiler/codegen/Optimizer.h
index 2b05476..dd8e788 100644
--- a/vm/compiler/codegen/Optimizer.h
+++ b/vm/compiler/codegen/Optimizer.h
@@ -23,14 +23,14 @@
  * If the corresponding bit is set in gDvmJit.disableOpt, the selected
  * optimization will be suppressed.
  */
-typedef enum optControlVector {
+enum optControlVector {
     kLoadStoreElimination = 0,
     kLoadHoisting,
     kTrackLiveTemps,
     kSuppressLoads,
     kMethodInlining,
     kMethodJit,
-} optControlVector;
+};
 
 /* Forward declarations */
 struct CompilationUnit;
diff --git a/vm/compiler/codegen/arm/CalloutHelper.h b/vm/compiler/codegen/arm/CalloutHelper.h
index 3bfb299..2660108 100644
--- a/vm/compiler/codegen/arm/CalloutHelper.h
+++ b/vm/compiler/codegen/arm/CalloutHelper.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_VM_COMPILER_CODEGEN_ARM_CALLOUT_HELPER_H
 #define _DALVIK_VM_COMPILER_CODEGEN_ARM_CALLOUT_HELPER_H
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Declare/comment prototypes of all native callout functions invoked by the
  * JIT'ed code here and use the LOAD_FUNC_ADDR macro to load the address into
@@ -35,37 +31,37 @@
 #define LOAD_FUNC_ADDR(cUnit, reg, addr) loadConstant(cUnit, reg, addr)
 
 /* Conversions */
-float __aeabi_i2f(int op1);             // OP_INT_TO_FLOAT
-int __aeabi_f2iz(float op1);            // OP_FLOAT_TO_INT
-float __aeabi_d2f(double op1);          // OP_DOUBLE_TO_FLOAT
-double __aeabi_f2d(float op1);          // OP_FLOAT_TO_DOUBLE
-double __aeabi_i2d(int op1);            // OP_INT_TO_DOUBLE
-int __aeabi_d2iz(double op1);           // OP_DOUBLE_TO_INT
-float __aeabi_l2f(long op1);            // OP_LONG_TO_FLOAT
-double __aeabi_l2d(long op1);           // OP_LONG_TO_DOUBLE
+extern "C" float __aeabi_i2f(int op1);             // OP_INT_TO_FLOAT
+extern "C" int __aeabi_f2iz(float op1);            // OP_FLOAT_TO_INT
+extern "C" float __aeabi_d2f(double op1);          // OP_DOUBLE_TO_FLOAT
+extern "C" double __aeabi_f2d(float op1);          // OP_FLOAT_TO_DOUBLE
+extern "C" double __aeabi_i2d(int op1);            // OP_INT_TO_DOUBLE
+extern "C" int __aeabi_d2iz(double op1);           // OP_DOUBLE_TO_INT
+extern "C" float __aeabi_l2f(long op1);            // OP_LONG_TO_FLOAT
+extern "C" double __aeabi_l2d(long op1);           // OP_LONG_TO_DOUBLE
 s8 dvmJitf2l(float op1);                // OP_FLOAT_TO_LONG
 s8 dvmJitd2l(double op1);               // OP_DOUBLE_TO_LONG
 
 /* Single-precision FP arithmetics */
-float __aeabi_fadd(float a, float b);   // OP_ADD_FLOAT[_2ADDR]
-float __aeabi_fsub(float a, float b);   // OP_SUB_FLOAT[_2ADDR]
-float __aeabi_fdiv(float a, float b);   // OP_DIV_FLOAT[_2ADDR]
-float __aeabi_fmul(float a, float b);   // OP_MUL_FLOAT[_2ADDR]
-float fmodf(float a, float b);          // OP_REM_FLOAT[_2ADDR]
+extern "C" float __aeabi_fadd(float a, float b);   // OP_ADD_FLOAT[_2ADDR]
+extern "C" float __aeabi_fsub(float a, float b);   // OP_SUB_FLOAT[_2ADDR]
+extern "C" float __aeabi_fdiv(float a, float b);   // OP_DIV_FLOAT[_2ADDR]
+extern "C" float __aeabi_fmul(float a, float b);   // OP_MUL_FLOAT[_2ADDR]
+extern "C" float fmodf(float a, float b);          // OP_REM_FLOAT[_2ADDR]
 
 /* Double-precision FP arithmetics */
-double __aeabi_dadd(double a, double b); // OP_ADD_DOUBLE[_2ADDR]
-double __aeabi_dsub(double a, double b); // OP_SUB_DOUBLE[_2ADDR]
-double __aeabi_ddiv(double a, double b); // OP_DIV_DOUBLE[_2ADDR]
-double __aeabi_dmul(double a, double b); // OP_MUL_DOUBLE[_2ADDR]
-double fmod(double a, double b);         // OP_REM_DOUBLE[_2ADDR]
+extern "C" double __aeabi_dadd(double a, double b); // OP_ADD_DOUBLE[_2ADDR]
+extern "C" double __aeabi_dsub(double a, double b); // OP_SUB_DOUBLE[_2ADDR]
+extern "C" double __aeabi_ddiv(double a, double b); // OP_DIV_DOUBLE[_2ADDR]
+extern "C" double __aeabi_dmul(double a, double b); // OP_MUL_DOUBLE[_2ADDR]
+extern "C" double fmod(double a, double b);         // OP_REM_DOUBLE[_2ADDR]
 
 /* Integer arithmetics */
-int __aeabi_idivmod(int op1, int op2);  // OP_REM_INT[_2ADDR|_LIT8|_LIT16]
-int __aeabi_idiv(int op1, int op2);     // OP_DIV_INT[_2ADDR|_LIT8|_LIT16]
+extern "C" int __aeabi_idivmod(int op1, int op2);  // OP_REM_INT[_2ADDR|_LIT8|_LIT16]
+extern "C" int __aeabi_idiv(int op1, int op2);     // OP_DIV_INT[_2ADDR|_LIT8|_LIT16]
 
 /* Long long arithmetics - OP_REM_LONG[_2ADDR] & OP_DIV_LONG[_2ADDR] */
-long long __aeabi_ldivmod(long long op1, long long op2);
+extern "C" long long __aeabi_ldivmod(long long op1, long long op2);
 
 /* Originally declared in Sync.h */
 bool dvmUnlockObject(struct Thread* self, struct Object* obj); //OP_MONITOR_EXIT
@@ -114,7 +110,7 @@
  * Functions declared in gDvmInlineOpsTable[] are used for
  * OP_EXECUTE_INLINE & OP_EXECUTE_INLINE_RANGE.
  */
-double sqrt(double x);  // INLINE_MATH_SQRT
+extern "C" double sqrt(double x);  // INLINE_MATH_SQRT
 
 /*
  * The following functions are invoked through the compiler templates (declared
@@ -125,8 +121,4 @@
  *      dvmLockObject           // MONITOR_ENTER
  */
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /* _DALVIK_VM_COMPILER_CODEGEN_ARM_CALLOUT_HELPER_H */
diff --git a/vm/compiler/codegen/arm/Codegen.h b/vm/compiler/codegen/arm/Codegen.h
index afeb340..e67f3d8 100644
--- a/vm/compiler/codegen/arm/Codegen.h
+++ b/vm/compiler/codegen/arm/Codegen.h
@@ -25,10 +25,6 @@
 #include "compiler/CompilerIR.h"
 #include "CalloutHelper.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #if defined(_CODEGEN_C)
 /*
  * loadConstant() sometimes needs to add a small imm to a pre-existing constant
@@ -60,14 +56,10 @@
 
 #if defined(WITH_SELF_VERIFICATION)
 /* Self Verification memory instruction decoder */
-void dvmSelfVerificationMemOpDecode(int lr, int* sp);
+extern "C" void dvmSelfVerificationMemOpDecode(int lr, int* sp);
 #endif
 
 extern void dvmCompilerSetupResourceMasks(ArmLIR *lir);
 
 extern ArmLIR* dvmCompilerRegCopyNoInsert(CompilationUnit *cUnit, int rDest,
                                           int rSrc);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.h b/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.h
index fa01210..452f2a5 100644
--- a/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.h
+++ b/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.h
@@ -19,7 +19,7 @@
 
 /* Create the TemplateOpcode enum */
 #define JIT_TEMPLATE(X) TEMPLATE_##X,
-typedef enum {
+enum TemplateOpcode {
 #include "../../../template/armv5te-vfp/TemplateOpList.h"
 /*
  * For example,
@@ -28,7 +28,7 @@
  *     ...
  */
     TEMPLATE_LAST_MARK,
-} TemplateOpcode;
+};
 #undef JIT_TEMPLATE
 
 #endif /* _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMV5TE_VFP_ARCHVARIANT_H */
diff --git a/vm/compiler/codegen/arm/armv5te/ArchVariant.h b/vm/compiler/codegen/arm/armv5te/ArchVariant.h
index 4cc4fa6..07a1c8c 100644
--- a/vm/compiler/codegen/arm/armv5te/ArchVariant.h
+++ b/vm/compiler/codegen/arm/armv5te/ArchVariant.h
@@ -19,7 +19,7 @@
 
 /* Create the TemplateOpcode enum */
 #define JIT_TEMPLATE(X) TEMPLATE_##X,
-typedef enum {
+enum TemplateOpcode {
 #include "../../../template/armv5te/TemplateOpList.h"
 /*
  * For example,
@@ -28,7 +28,7 @@
  *     ...
  */
     TEMPLATE_LAST_MARK,
-} TemplateOpcode;
+};
 #undef JIT_TEMPLATE
 
 #endif /* _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMV5TE_ARCHVARIANT_H */
diff --git a/vm/compiler/codegen/arm/armv7-a/ArchVariant.h b/vm/compiler/codegen/arm/armv7-a/ArchVariant.h
index 747ecc1..66e236b 100644
--- a/vm/compiler/codegen/arm/armv7-a/ArchVariant.h
+++ b/vm/compiler/codegen/arm/armv7-a/ArchVariant.h
@@ -14,16 +14,12 @@
  * limitations under the License.
  */
 
-#ifndef _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMV5TE_VFP_ARCHVARIANT_H
-#define _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMV5TE_VFP_ARCHVARIANT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
+#ifndef _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMV7_A_ARCHVARIANT_H
+#define _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMV7_A_ARCHVARIANT_H
 
 /* Create the TemplateOpcode enum */
 #define JIT_TEMPLATE(X) TEMPLATE_##X,
-typedef enum {
+enum TemplateOpcode {
 #include "../../../template/armv5te-vfp/TemplateOpList.h"
 /*
  * For example,
@@ -32,11 +28,7 @@
  *     ...
  */
     TEMPLATE_LAST_MARK,
-} TemplateOpcode;
+};
 #undef JIT_TEMPLATE
 
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMV5TE_VFP_ARCHVARIANT_H */
+#endif /* _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMV7_A_ARCHVARIANT_H */
diff --git a/vm/compiler/codegen/x86/CalloutHelper.h b/vm/compiler/codegen/x86/CalloutHelper.h
index a64f017..52c030f 100644
--- a/vm/compiler/codegen/x86/CalloutHelper.h
+++ b/vm/compiler/codegen/x86/CalloutHelper.h
@@ -54,6 +54,6 @@
  * Functions declared in gDvmInlineOpsTable[] are used for
  * OP_EXECUTE_INLINE & OP_EXECUTE_INLINE_RANGE.
  */
-double sqrt(double x);  // INLINE_MATH_SQRT
+extern "C" double sqrt(double x);  // INLINE_MATH_SQRT
 
 #endif /* _DALVIK_VM_COMPILER_CODEGEN_X86_CALLOUT_HELPER_H */
diff --git a/vm/compiler/codegen/x86/ia32/ArchVariant.h b/vm/compiler/codegen/x86/ia32/ArchVariant.h
index e4eebf3..c5ce38e 100644
--- a/vm/compiler/codegen/x86/ia32/ArchVariant.h
+++ b/vm/compiler/codegen/x86/ia32/ArchVariant.h
@@ -19,7 +19,7 @@
 
 /* Create the TemplateOpcode enum */
 #define JIT_TEMPLATE(X) TEMPLATE_##X,
-typedef enum {
+enum TemplateOpcode {
 #include "../../../template/ia32/TemplateOpList.h"
 /*
  * For example,
@@ -28,7 +28,7 @@
  *     ...
  */
     TEMPLATE_LAST_MARK,
-} TemplateOpcode;
+};
 #undef JIT_TEMPLATE
 
 #endif /* _DALVIK_VM_COMPILER_CODEGEN_X86_IA32_ARCHVARIANT_H */
diff --git a/vm/hprof/Hprof.h b/vm/hprof/Hprof.h
index 1721a6e..e31ccc3 100644
--- a/vm/hprof/Hprof.h
+++ b/vm/hprof/Hprof.h
@@ -18,10 +18,6 @@
 
 #include "Dalvik.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #define HPROF_ID_SIZE (sizeof (u4))
 
 #define UNIQUE_ERROR() \
@@ -36,7 +32,7 @@
 typedef hprof_id hprof_object_id;
 typedef hprof_id hprof_class_object_id;
 
-typedef enum hprof_basic_type {
+enum hprof_basic_type {
     hprof_basic_object = 2,
     hprof_basic_boolean = 4,
     hprof_basic_char = 5,
@@ -46,9 +42,9 @@
     hprof_basic_short = 9,
     hprof_basic_int = 10,
     hprof_basic_long = 11,
-} hprof_basic_type;
+};
 
-typedef enum hprof_tag_t {
+enum hprof_tag_t {
     HPROF_TAG_STRING = 0x01,
     HPROF_TAG_LOAD_CLASS = 0x02,
     HPROF_TAG_UNLOAD_CLASS = 0x03,
@@ -63,13 +59,13 @@
     HPROF_TAG_HEAP_DUMP_END = 0x2C,
     HPROF_TAG_CPU_SAMPLES = 0x0D,
     HPROF_TAG_CONTROL_SETTINGS = 0x0E,
-} hprof_tag_t;
+};
 
 /* Values for the first byte of
  * HEAP_DUMP and HEAP_DUMP_SEGMENT
  * records:
  */
-typedef enum hprof_heap_tag_t {
+enum hprof_heap_tag_t {
     /* standard */
     HPROF_ROOT_UNKNOWN = 0xFF,
     HPROF_ROOT_JNI_GLOBAL = 0x01,
@@ -95,7 +91,7 @@
     HPROF_ROOT_JNI_MONITOR = 0x8e,
     HPROF_UNREACHABLE = 0x90,  /* obsolete */
     HPROF_PRIMITIVE_ARRAY_NODATA_DUMP = 0xc3,
-} hprof_heap_tag_t;
+};
 
 /* Represents a top-level hprof record, whose serialized
  * format is:
@@ -106,22 +102,22 @@
  *                    and belong to this record
  *     [u1]*  BODY: as many bytes as specified in the above u4 field
  */
-typedef struct hprof_record_t {
+struct hprof_record_t {
     unsigned char *body;
     u4 time;
     u4 length;
     size_t allocLen;
     u1 tag;
     bool dirty;
-} hprof_record_t;
+};
 
-typedef enum {
+enum HprofHeapId {
     HPROF_HEAP_DEFAULT = 0,
     HPROF_HEAP_ZYGOTE = 'Z',
     HPROF_HEAP_APP = 'A'
-} HprofHeapId;
+};
 
-typedef struct hprof_context_t {
+struct hprof_context_t {
     /* curRec *must* be first so that we
      * can cast from a context to a record.
      */
@@ -144,7 +140,7 @@
     size_t fileDataSize;        // for open_memstream
     FILE *memFp;
     int fd;
-} hprof_context_t;
+};
 
 
 /*
@@ -228,8 +224,4 @@
 void hprofFreeContext(hprof_context_t *ctx);
 int hprofDumpHeap(const char* fileName, int fd, bool directToDdms);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif  // _DALVIK_HPROF_HPROF
diff --git a/vm/interp/Interp.cpp b/vm/interp/Interp.cpp
index c219f36..f61f7ba 100644
--- a/vm/interp/Interp.cpp
+++ b/vm/interp/Interp.cpp
@@ -79,12 +79,12 @@
  * The debugger may ask us to create the same breakpoint multiple times.
  * We only remove the breakpoint when the last instance is cleared.
  */
-typedef struct {
+struct Breakpoint {
     Method*     method;                 /* method we're associated with */
     u2*         addr;                   /* absolute memory address */
     u1          originalOpcode;         /* original 8-bit opcode value */
     int         setCount;               /* #of times this breakpoint was set */
-} Breakpoint;
+};
 
 /*
  * Set of breakpoints.
diff --git a/vm/interp/Interp.h b/vm/interp/Interp.h
index f0f2198..0667a2e 100644
--- a/vm/interp/Interp.h
+++ b/vm/interp/Interp.h
@@ -20,10 +20,6 @@
 #ifndef _DALVIK_INTERP_INTERP
 #define _DALVIK_INTERP_INTERP
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Stash the dalvik PC in the frame.  Called  during interpretation.
  */
@@ -50,7 +46,8 @@
  * This is called from the handler for the throw-verification-error
  * instruction.  "method" is the method currently being executed.
  */
-void dvmThrowVerificationError(const Method* method, int kind, int ref);
+extern "C" void dvmThrowVerificationError(const Method* method,
+                                          int kind, int ref);
 
 /*
  * One-time initialization and shutdown.
@@ -71,7 +68,7 @@
 /*
  * Recover the opcode that was replaced by a breakpoint.
  */
-u1 dvmGetOriginalOpcode(const u2* addr);
+extern "C" u1 dvmGetOriginalOpcode(const u2* addr);
 
 /*
  * Flush any breakpoints associated with methods in "clazz".
@@ -81,18 +78,18 @@
 /*
  * Debugger support
  */
-void dvmCheckBefore(const u2 *dPC, u4 *fp, Thread* self);
-void dvmReportExceptionThrow(Thread* self, Object* exception);
-void dvmReportPreNativeInvoke(const Method* methodToCall, Thread* self, u4* fp);
-void dvmReportPostNativeInvoke(const Method* methodToCall, Thread* self, u4* fp);
-void dvmReportInvoke(Thread* self, const Method* methodToCall);
-void dvmReportReturn(Thread* self);
+extern "C" void dvmCheckBefore(const u2 *dPC, u4 *fp, Thread* self);
+extern "C" void dvmReportExceptionThrow(Thread* self, Object* exception);
+extern "C" void dvmReportPreNativeInvoke(const Method* methodToCall, Thread* self, u4* fp);
+extern "C" void dvmReportPostNativeInvoke(const Method* methodToCall, Thread* self, u4* fp);
+extern "C" void dvmReportInvoke(Thread* self, const Method* methodToCall);
+extern "C" void dvmReportReturn(Thread* self);
 
 /*
  * InterpBreak & subMode control
  */
 void dvmDisableSubMode(Thread* thread, ExecutionSubModes subMode);
-void dvmEnableSubMode(Thread* thread, ExecutionSubModes subMode);
+extern "C" void dvmEnableSubMode(Thread* thread, ExecutionSubModes subMode);
 void dvmDisableAllSubMode(ExecutionSubModes subMode);
 void dvmEnableAllSubMode(ExecutionSubModes subMode);
 void dvmAddToSuspendCounts(Thread* thread, int delta, int dbgDelta);
@@ -118,8 +115,4 @@
 extern void* dvmAsmAltInstructionStart[];
 #endif
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_INTERP_INTERP*/
diff --git a/vm/interp/InterpDefs.h b/vm/interp/InterpDefs.h
index c2f4295..f362442 100644
--- a/vm/interp/InterpDefs.h
+++ b/vm/interp/InterpDefs.h
@@ -24,10 +24,6 @@
 #ifndef _DALVIK_INTERP_DEFS
 #define _DALVIK_INTERP_DEFS
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #if defined(WITH_JIT)
 /*
  * Size of save area for callee-save FP regs, which are not automatically
@@ -63,13 +59,13 @@
 /*
  * Process switch statement.
  */
-s4 dvmInterpHandlePackedSwitch(const u2* switchData, s4 testVal);
-s4 dvmInterpHandleSparseSwitch(const u2* switchData, s4 testVal);
+extern "C" s4 dvmInterpHandlePackedSwitch(const u2* switchData, s4 testVal);
+extern "C" s4 dvmInterpHandleSparseSwitch(const u2* switchData, s4 testVal);
 
 /*
  * Process fill-array-data.
  */
-bool dvmInterpHandleFillArrayData(ArrayObject* arrayObject,
+extern "C" bool dvmInterpHandleFillArrayData(ArrayObject* arrayObject,
                                   const u2* arrayData);
 
 /*
@@ -109,8 +105,4 @@
 
 #endif
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_INTERP_DEFS*/
diff --git a/vm/interp/InterpState.h b/vm/interp/InterpState.h
index d50967d..3795bf9 100644
--- a/vm/interp/InterpState.h
+++ b/vm/interp/InterpState.h
@@ -24,21 +24,17 @@
 #ifndef _DALVIK_INTERP_STATE
 #define _DALVIK_INTERP_STATE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Execution mode, e.g. interpreter vs. JIT.
  */
-typedef enum ExecutionMode {
+enum ExecutionMode {
     kExecutionModeUnknown = 0,
     kExecutionModeInterpPortable,
     kExecutionModeInterpFast,
 #if defined(WITH_JIT)
     kExecutionModeJit,
 #endif
-} ExecutionMode;
+};
 
 /*
  * Execution sub modes, e.g. debugging, profiling, etc.
@@ -46,7 +42,7 @@
  * by assembly code in the mterp interpeter and may also be used by
  * code generated by the JIT.  Take care when changing.
  */
-typedef enum ExecutionSubModes {
+enum ExecutionSubModes {
     kSubModeNormal            = 0x0000,   /* No active subMode */
     kSubModeMethodTrace       = 0x0001,
     kSubModeEmulatorTrace     = 0x0002,
@@ -61,7 +57,7 @@
                               kSubModeEmulatorTrace |
                               kSubModeInstCounting |
                               kSubModeDebuggerActive)
-} ExecutionSubModes;
+};
 
 /*
  * Interpreter break flags.  When set, causes the interpreter to
@@ -69,11 +65,11 @@
  * handler.
  */
 
-typedef enum InterpBreakFlags {
+enum InterpBreakFlags {
     kInterpNoBreak            = 0x00,    /* Don't check */
     kInterpSingleStep         = 0x01,    /* Check between each inst */
     kInterpSafePoint          = 0x02,    /* Check at safe points */
-} InterpBreakFlags;
+};
 
 /*
  * Mapping between subModes and required check intervals.  Note: in
@@ -96,7 +92,7 @@
  */
 #define LOCAL_SUBMODE (kSubModeJitTraceBuild)
 
-typedef struct InterpSaveState {
+struct InterpSaveState {
     const u2*       pc;         // Dalvik PC
     u4*             curFrame;   // Dalvik frame pointer
     const Method    *method;    // Method being executed
@@ -108,7 +104,7 @@
     int             unused;        // Keep struct size constant
 #endif
     struct InterpSaveState* prev;  // To follow nested activations
-} InterpSaveState;
+};
 
 #ifdef WITH_JIT
 /*
@@ -150,7 +146,7 @@
 };
 
 /* States of the interpreter when serving a JIT-related request */
-typedef enum JitState {
+enum JitState {
     /* Entering states in the debug interpreter */
     kJitNot = 0,               // Non-JIT related reasons */
     kJitTSelectRequest = 1,    // Request a trace (subject to filtering)
@@ -161,10 +157,10 @@
     kJitTSelect = 4,           // Actively selecting a trace
     kJitTSelectEnd = 5,        // Done with the trace - wrap it up
     kJitDone = 6,              // No further JIT actions for interpBreak
-} JitState;
+};
 
 #if defined(WITH_SELF_VERIFICATION)
-typedef enum SelfVerificationState {
+enum SelfVerificationState {
     kSVSIdle = 0,           // Idle
     kSVSStart = 1,          // Shadow space set up, running compiled code
     kSVSPunt = 2,           // Exiting compiled code by punting
@@ -175,7 +171,7 @@
     kSVSNoChain = 7,        // Exiting compiled code by no chain
     kSVSBackwardBranch = 8, // Exiting compiled code with backward branch trace
     kSVSDebugInterp = 9,    // Normal state restored, running debug interpreter
-} SelfVerificationState;
+};
 #endif
 
 /* Number of entries in the 2nd level JIT profiler filter cache */
@@ -184,23 +180,23 @@
 #define JIT_TRACE_THRESH_FILTER_PC_BITS 4
 #define MAX_JIT_RUN_LEN 64
 
-typedef enum JitHint {
+enum JitHint {
    kJitHintNone = 0,
    kJitHintTaken = 1,         // Last inst in run was taken branch
    kJitHintNotTaken = 2,      // Last inst in run was not taken branch
    kJitHintNoBias = 3,        // Last inst in run was unbiased branch
-} jitHint;
+};
 
 /*
  * Element of a Jit trace description. If the isCode bit is set, it describes
  * a contiguous sequence of Dalvik byte codes.
  */
-typedef struct {
+struct JitCodeDesc {
     unsigned numInsts:8;     // Number of Byte codes in run
     unsigned runEnd:1;       // Run ends with last byte code
-    jitHint  hint:7;         // Hint to apply to final code of run
-    u2    startOffset;       // Starting offset for trace run
-} JitCodeDesc;
+    JitHint hint:7;          // Hint to apply to final code of run
+    u2 startOffset;          // Starting offset for trace run
+};
 
 /*
  * A complete list of trace runs passed to the compiler looks like the
@@ -224,19 +220,15 @@
  * descriptor/loader of "this" and the currently resolved method pointer are
  * three instances of meta information stored there.
  */
-typedef struct {
+struct JitTraceRun {
     union {
         JitCodeDesc frag;
         void*       meta;
     } info;
     u4 isCode:1;
     u4 unused:31;
-} JitTraceRun;
+};
 
 #endif
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_INTERP_STATE*/
diff --git a/vm/interp/Jit.h b/vm/interp/Jit.h
index c05fadd..89256ca 100644
--- a/vm/interp/Jit.h
+++ b/vm/interp/Jit.h
@@ -22,10 +22,6 @@
 #include "InterpDefs.h"
 #include "mterp/common/jit-config.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 #define JIT_MAX_TRACE_LEN 100
 
 #if defined (WITH_SELF_VERIFICATION)
@@ -33,17 +29,17 @@
 #define REG_SPACE 256                /* default size of shadow space */
 #define HEAP_SPACE JIT_MAX_TRACE_LEN /* default size of heap space */
 
-typedef struct ShadowHeap {
+struct ShadowHeap {
     int addr;
     int data;
-} ShadowHeap;
+};
 
-typedef struct InstructionTrace {
+struct InstructionTrace {
     int addr;
     DecodedInstruction decInsn;
-} InstructionTrace;
+};
 
-typedef struct ShadowSpace {
+struct ShadowSpace {
     const u2* startPC;          /* starting pc of jitted region */
     u4* fp;                     /* starting fp of jitted region */
     const Method *method;
@@ -61,11 +57,12 @@
     const void* endShadowFP;    /* ending fp in shadow space */
     InstructionTrace trace[JIT_MAX_TRACE_LEN]; /* opcode trace for debugging */
     int traceLength;            /* counter for current trace length */
-} ShadowSpace;
+};
 
 /*
  * Self verification functions.
  */
+extern "C" {
 void* dvmSelfVerificationShadowSpaceAlloc(Thread* self);
 void dvmSelfVerificationShadowSpaceFree(Thread* self);
 void* dvmSelfVerificationSaveState(const u2* pc, u4* fp,
@@ -75,6 +72,7 @@
                                       SelfVerificationState exitPoint,
                                       Thread *self);
 void dvmCheckSelfVerification(const u2* pc, Thread* self);
+}
 #endif
 
 /*
@@ -115,10 +113,10 @@
 
 typedef s4 JitTraceCounter_t;
 
-typedef struct JitTraceProfCounters {
+struct JitTraceProfCounters {
     unsigned int           next;
     JitTraceCounter_t      *buckets[JIT_PROF_BLOCK_BUCKETS];
-} JitTraceProfCounters;
+};
 
 /*
  * Entries in the JIT's address lookup hash table.
@@ -126,7 +124,7 @@
  * single 32-bit word to allow use of atomic update.
  */
 
-typedef struct JitEntryInfo {
+struct JitEntryInfo {
     unsigned int           isMethodEntry:1;
     unsigned int           inlineCandidate:1;
     unsigned int           profileEnabled:1;
@@ -134,19 +132,20 @@
     unsigned int           profileOffset:5;
     unsigned int           unused:5;
     u2                     chain;                 /* Index of next in chain */
-} JitEntryInfo;
+};
 
-typedef union JitEntryInfoUnion {
+union JitEntryInfoUnion {
     JitEntryInfo info;
     volatile int infoWord;
-} JitEntryInfoUnion;
+};
 
-typedef struct JitEntry {
+struct JitEntry {
     JitEntryInfoUnion   u;
     const u2*           dPC;            /* Dalvik code address */
     void*               codeAddress;    /* Code address of native translation */
-} JitEntry;
+};
 
+extern "C" {
 void dvmCheckJit(const u2* pc, Thread* self);
 void* dvmJitGetTraceAddr(const u2* dPC);
 void* dvmJitGetMethodAddr(const u2* dPC);
@@ -162,7 +161,7 @@
 void dvmJitStats(void);
 bool dvmJitResizeJitTable(unsigned int size);
 void dvmJitResetTable(void);
-struct JitEntry *dvmJitFindEntry(const u2* pc, bool isMethodEntry);
+JitEntry *dvmJitFindEntry(const u2* pc, bool isMethodEntry);
 s8 dvmJitd2l(double d);
 s8 dvmJitf2l(float f);
 void dvmJitSetCodeAddr(const u2* dPC, void *nPC, JitInstructionSetType set,
@@ -176,9 +175,6 @@
 void dvmJitUpdateThreadStateSingle(Thread* threead);
 void dvmJitUpdateThreadStateAll(void);
 void dvmJitResumeTranslation(Thread* self, const u2* pc, const u4* fp);
-
-#ifdef __cplusplus
 }
-#endif
 
 #endif /*_DALVIK_INTERP_JIT*/
diff --git a/vm/interp/Stack.cpp b/vm/interp/Stack.cpp
index 120726e..23d8049 100644
--- a/vm/interp/Stack.cpp
+++ b/vm/interp/Stack.cpp
@@ -780,10 +780,10 @@
     return retObj;
 }
 
-typedef struct LineNumFromPcContext {
+struct LineNumFromPcContext {
     u4 address;
     u4 lineNum;
-} LineNumFromPcContext;
+};
 
 static int lineNumForPcCb(void *cnxt, u4 address, u4 lineNum)
 {
diff --git a/vm/interp/Stack.h b/vm/interp/Stack.h
index 69dd3da..4e806b7 100644
--- a/vm/interp/Stack.h
+++ b/vm/interp/Stack.h
@@ -23,10 +23,6 @@
 #include "jni.h"
 #include <stdarg.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
 Stack layout
 
@@ -111,7 +107,6 @@
 
 
 struct StackSaveArea;
-typedef struct StackSaveArea StackSaveArea;
 
 //#define PAD_SAVE_AREA       /* help debug stack trampling */
 
@@ -274,15 +269,11 @@
 /*
  * Common handling for stack overflow.
  */
-void dvmHandleStackOverflow(Thread* self, const Method* method);
-void dvmCleanupStackOverflow(Thread* self, const Object* exception);
+extern "C" void dvmHandleStackOverflow(Thread* self, const Method* method);
+extern "C" void dvmCleanupStackOverflow(Thread* self, const Object* exception);
 
 /* debugging; dvmDumpThread() is probably a better starting point */
 void dvmDumpThreadStack(const DebugOutputTarget* target, Thread* thread);
 void dvmDumpRunningThreadStack(const DebugOutputTarget* target, Thread* thread);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_INTERP_STACK*/
diff --git a/vm/jdwp/ExpandBuf.h b/vm/jdwp/ExpandBuf.h
index fea3a4d..6bdab0f 100644
--- a/vm/jdwp/ExpandBuf.h
+++ b/vm/jdwp/ExpandBuf.h
@@ -21,12 +21,7 @@
 
 #include "Common.h"     // need u1/u2/u4/u8 types
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 struct ExpandBuf;   /* private */
-typedef struct ExpandBuf ExpandBuf;
 
 /* create a new struct */
 ExpandBuf* expandBufAlloc(void);
@@ -58,8 +53,4 @@
 void expandBufAdd8BE(ExpandBuf* pBuf, u8 val);
 void expandBufAddUtf8String(ExpandBuf* pBuf, const u1* str);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_JDWP_EXPANDBUF*/
diff --git a/vm/jdwp/Jdwp.h b/vm/jdwp/Jdwp.h
index fb92e2a..9199a1e 100644
--- a/vm/jdwp/Jdwp.h
+++ b/vm/jdwp/Jdwp.h
@@ -30,12 +30,7 @@
 #include "Bits.h"
 #include <pthread.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 struct JdwpState;       /* opaque */
-typedef struct JdwpState JdwpState;
 
 /*
  * Fundamental types.
@@ -82,34 +77,33 @@
 /*
  * Holds a JDWP "location".
  */
-typedef struct JdwpLocation {
+struct JdwpLocation {
     u1          typeTag;        /* class or interface? */
     RefTypeId   classId;        /* method->clazz */
     MethodId    methodId;       /* method in which "idx" resides */
     u8          idx;            /* relative index into code block */
-} JdwpLocation;
-//#define kJDWPLocationSize   (25)
+};
 
 /*
  * How we talk to the debugger.
  */
-typedef enum JdwpTransportType {
+enum JdwpTransportType {
     kJdwpTransportUnknown = 0,
     kJdwpTransportSocket,       /* transport=dt_socket */
     kJdwpTransportAndroidAdb,   /* transport=dt_android_adb */
-} JdwpTransportType;
+};
 
 /*
  * Holds collection of JDWP initialization parameters.
  */
-typedef struct JdwpStartupParams {
+struct JdwpStartupParams {
     JdwpTransportType transport;
     bool        server;
     bool        suspend;
     char        host[64];
     short       port;
     /* more will be here someday */
-} JdwpStartupParams;
+};
 
 /*
  * Perform one-time initialization.
@@ -239,8 +233,4 @@
 void dvmJdwpDdmSendChunkV(JdwpState* state, int type, const struct iovec* iov,
     int iovcnt);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_JDWP_JDWP*/
diff --git a/vm/jdwp/JdwpConstants.cpp b/vm/jdwp/JdwpConstants.cpp
index 4b1418b..ab9d872 100644
--- a/vm/jdwp/JdwpConstants.cpp
+++ b/vm/jdwp/JdwpConstants.cpp
@@ -23,7 +23,7 @@
 /*
  * Return a string for the error code.
  */
-const char* dvmJdwpErrorStr(enum JdwpError error)
+const char* dvmJdwpErrorStr(JdwpError error)
 {
     switch (error) {
     case ERR_NONE:
@@ -146,7 +146,7 @@
 /*
  * Return a string for the EventKind.
  */
-const char* dvmJdwpEventKindStr(enum JdwpEventKind kind)
+const char* dvmJdwpEventKindStr(JdwpEventKind kind)
 {
     switch (kind) {
     case EK_SINGLE_STEP:        return "SINGLE_STEP";
@@ -176,7 +176,7 @@
 /*
  * Return a string for the ModKind.
  */
-const char* dvmJdwpModKindStr(enum JdwpModKind kind)
+const char* dvmJdwpModKindStr(JdwpModKind kind)
 {
     switch (kind) {
     case MK_COUNT:              return "COUNT";
@@ -197,7 +197,7 @@
 /*
  * Return a string for the StepDepth.
  */
-const char* dvmJdwpStepDepthStr(enum JdwpStepDepth depth)
+const char* dvmJdwpStepDepthStr(JdwpStepDepth depth)
 {
     switch (depth) {
     case SD_INTO:               return "INTO";
@@ -210,7 +210,7 @@
 /*
  * Return a string for the StepSize.
  */
-const char* dvmJdwpStepSizeStr(enum JdwpStepSize size)
+const char* dvmJdwpStepSizeStr(JdwpStepSize size)
 {
     switch (size) {
     case SS_MIN:                return "MIN";
@@ -222,7 +222,7 @@
 /*
  * Return a string for the SuspendPolicy.
  */
-const char* dvmJdwpSuspendPolicyStr(enum JdwpSuspendPolicy policy)
+const char* dvmJdwpSuspendPolicyStr(JdwpSuspendPolicy policy)
 {
     switch (policy) {
     case SP_NONE:               return "NONE";
@@ -235,7 +235,7 @@
 /*
  * Return a string for the SuspendStatus.
  */
-const char* dvmJdwpSuspendStatusStr(enum JdwpSuspendStatus status)
+const char* dvmJdwpSuspendStatusStr(JdwpSuspendStatus status)
 {
     switch (status) {
     case 0:                         return "Not SUSPENDED";
@@ -247,7 +247,7 @@
 /*
  * Return a string for the ThreadStatus.
  */
-const char* dvmJdwpThreadStatusStr(enum JdwpThreadStatus status)
+const char* dvmJdwpThreadStatusStr(JdwpThreadStatus status)
 {
     switch (status) {
     case TS_ZOMBIE:             return "ZOMBIE";
diff --git a/vm/jdwp/JdwpConstants.h b/vm/jdwp/JdwpConstants.h
index dc3a279..f3049e5 100644
--- a/vm/jdwp/JdwpConstants.h
+++ b/vm/jdwp/JdwpConstants.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_JDWP_JDWPCONSTANTS
 #define _DALVIK_JDWP_JDWPCONSTANTS
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Error constants.
  */
@@ -84,8 +80,7 @@
     ERR_NATIVE_METHOD                               = 511,
     ERR_INVALID_COUNT                               = 512,
 };
-typedef enum JdwpError JdwpError;
-const char* dvmJdwpErrorStr(enum JdwpError error);
+const char* dvmJdwpErrorStr(JdwpError error);
 
 
 /*
@@ -123,7 +118,7 @@
     EK_VM_START             = EK_VM_INIT,
     EK_THREAD_DEATH         = EK_THREAD_END,
 };
-const char* dvmJdwpEventKindStr(enum JdwpEventKind kind);
+const char* dvmJdwpEventKindStr(JdwpEventKind kind);
 
 /*
  * Values for "modKind" in EventRequest.Set.
@@ -141,7 +136,7 @@
     MK_STEP                 = 10,
     MK_INSTANCE_ONLY        = 11,
 };
-const char* dvmJdwpModKindStr(enum JdwpModKind kind);
+const char* dvmJdwpModKindStr(JdwpModKind kind);
 
 /*
  * InvokeOptions constants (bit flags).
@@ -159,7 +154,7 @@
     SD_OVER                 = 1,    /* step over method calls */
     SD_OUT                  = 2,    /* step out of current method */
 };
-const char* dvmJdwpStepDepthStr(enum JdwpStepDepth depth);
+const char* dvmJdwpStepDepthStr(JdwpStepDepth depth);
 
 /*
  * StepSize constants.
@@ -168,7 +163,7 @@
     SS_MIN                  = 0,    /* step by minimum (e.g. 1 bytecode inst) */
     SS_LINE                 = 1,    /* if possible, step to next line */
 };
-const char* dvmJdwpStepSizeStr(enum JdwpStepSize size);
+const char* dvmJdwpStepSizeStr(JdwpStepSize size);
 
 /*
  * SuspendPolicy constants.
@@ -178,7 +173,7 @@
     SP_EVENT_THREAD         = 1,    /* suspend event thread */
     SP_ALL                  = 2,    /* suspend all threads */
 };
-const char* dvmJdwpSuspendPolicyStr(enum JdwpSuspendPolicy policy);
+const char* dvmJdwpSuspendPolicyStr(JdwpSuspendPolicy policy);
 
 /*
  * SuspendStatus constants.
@@ -186,7 +181,7 @@
 enum JdwpSuspendStatus {
     SUSPEND_STATUS_SUSPENDED = 1,
 };
-const char* dvmJdwpSuspendStatusStr(enum JdwpSuspendStatus status);
+const char* dvmJdwpSuspendStatusStr(JdwpSuspendStatus status);
 
 /*
  * ThreadStatus constants.
@@ -198,7 +193,7 @@
     TS_MONITOR              = 3,        // WAITING (monitor wait)
     TS_WAIT                 = 4,        // (in Object.wait())
 };
-const char* dvmJdwpThreadStatusStr(enum JdwpThreadStatus status);
+const char* dvmJdwpThreadStatusStr(JdwpThreadStatus status);
 
 /*
  * TypeTag constants.
@@ -231,8 +226,4 @@
     JT_CLASS_OBJECT          = 'c',
 };
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_JDWP_JDWPCONSTANTS*/
diff --git a/vm/jdwp/JdwpEvent.cpp b/vm/jdwp/JdwpEvent.cpp
index f93faaa..15f0b2a 100644
--- a/vm/jdwp/JdwpEvent.cpp
+++ b/vm/jdwp/JdwpEvent.cpp
@@ -100,7 +100,7 @@
  * values for mods valid for the event being evaluated will be filled in.
  * The rest will be zeroed.
  */
-typedef struct ModBasket {
+struct ModBasket {
     const JdwpLocation* pLoc;           /* LocationOnly */
     const char*         className;      /* ClassMatch/ClassExclude */
     ObjectId            threadId;       /* ThreadOnly */
@@ -110,7 +110,7 @@
     FieldId             field;          /* FieldOnly */
     ObjectId            thisPtr;        /* InstanceOnly */
     /* nothing for StepOnly -- handled differently */
-} ModBasket;
+};
 
 /*
  * Get the next "request" serial number.  We use this when sending
@@ -536,7 +536,7 @@
  * DO NOT call this multiple times for the same eventKind, as Count mods are
  * decremented during the scan.
  */
-static void findMatchingEvents(JdwpState* state, enum JdwpEventKind eventKind,
+static void findMatchingEvents(JdwpState* state, JdwpEventKind eventKind,
     ModBasket* basket, JdwpEvent** matchList, int* pMatchCount)
 {
     /* start after the existing entries */
@@ -558,10 +558,10 @@
  * Scan through the list of matches and determine the most severe
  * suspension policy.
  */
-static enum JdwpSuspendPolicy scanSuspendPolicy(JdwpEvent** matchList,
+static JdwpSuspendPolicy scanSuspendPolicy(JdwpEvent** matchList,
     int matchCount)
 {
-    enum JdwpSuspendPolicy policy = SP_NONE;
+    JdwpSuspendPolicy policy = SP_NONE;
 
     while (matchCount--) {
         if ((*matchList)->suspendPolicy > policy)
@@ -578,8 +578,7 @@
  *  SP_EVENT_THREAD - suspend ourselves
  *  SP_ALL - suspend everybody except JDWP support thread
  */
-static void suspendByPolicy(JdwpState* state,
-    enum JdwpSuspendPolicy suspendPolicy)
+static void suspendByPolicy(JdwpState* state, JdwpSuspendPolicy suspendPolicy)
 {
     if (suspendPolicy == SP_NONE)
         return;
@@ -745,7 +744,7 @@
  */
 bool dvmJdwpPostVMStart(JdwpState* state, bool suspend)
 {
-    enum JdwpSuspendPolicy suspendPolicy;
+    JdwpSuspendPolicy suspendPolicy;
     ObjectId threadId = dvmDbgGetThreadSelfId();
 
     if (suspend)
@@ -811,7 +810,7 @@
 bool dvmJdwpPostLocationEvent(JdwpState* state, const JdwpLocation* pLoc,
     ObjectId thisPtr, int eventFlags)
 {
-    enum JdwpSuspendPolicy suspendPolicy = SP_NONE;
+    JdwpSuspendPolicy suspendPolicy = SP_NONE;
     ModBasket basket;
     char* nameAlloc = NULL;
 
@@ -920,7 +919,7 @@
  */
 bool dvmJdwpPostThreadChange(JdwpState* state, ObjectId threadId, bool start)
 {
-    enum JdwpSuspendPolicy suspendPolicy = SP_NONE;
+    JdwpSuspendPolicy suspendPolicy = SP_NONE;
 
     assert(threadId = dvmDbgGetThreadSelfId());
 
@@ -1024,7 +1023,7 @@
     ObjectId exceptionId, RefTypeId exceptionClassId,
     const JdwpLocation* pCatchLoc, ObjectId thisPtr)
 {
-    enum JdwpSuspendPolicy suspendPolicy = SP_NONE;
+    JdwpSuspendPolicy suspendPolicy = SP_NONE;
     ModBasket basket;
     char* nameAlloc = NULL;
 
@@ -1122,7 +1121,7 @@
 bool dvmJdwpPostClassPrepare(JdwpState* state, int tag, RefTypeId refTypeId,
     const char* signature, int status)
 {
-    enum JdwpSuspendPolicy suspendPolicy = SP_NONE;
+    JdwpSuspendPolicy suspendPolicy = SP_NONE;
     ModBasket basket;
     char* nameAlloc = NULL;
 
diff --git a/vm/jdwp/JdwpEvent.h b/vm/jdwp/JdwpEvent.h
index 110d0f2..1eb9b15 100644
--- a/vm/jdwp/JdwpEvent.h
+++ b/vm/jdwp/JdwpEvent.h
@@ -22,14 +22,10 @@
 #include "JdwpConstants.h"
 #include "ExpandBuf.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Event modifiers.  A JdwpEvent may have zero or more of these.
  */
-typedef union JdwpEventMod {
+union JdwpEventMod {
     u1      modKind;                /* JdwpModKind */
     struct {
         u1          modKind;
@@ -80,24 +76,24 @@
         u1          modKind;
         ObjectId    objectId;
     } instanceOnly;
-} JdwpEventMod;
+};
 
 /*
  * One of these for every registered event.
  *
  * We over-allocate the struct to hold the modifiers.
  */
-typedef struct JdwpEvent {
-    struct JdwpEvent*       prev;           /* linked list */
-    struct JdwpEvent*       next;
+struct JdwpEvent {
+    JdwpEvent* prev;           /* linked list */
+    JdwpEvent* next;
 
-    enum JdwpEventKind      eventKind;      /* what kind of event is this? */
-    enum JdwpSuspendPolicy  suspendPolicy;  /* suspend all, none, or self? */
-    int                     modCount;       /* #of entries in mods[] */
-    u4                      requestId;      /* serial#, reported to debugger */
+    JdwpEventKind eventKind;      /* what kind of event is this? */
+    JdwpSuspendPolicy suspendPolicy;  /* suspend all, none, or self? */
+    int modCount;       /* #of entries in mods[] */
+    u4 requestId;      /* serial#, reported to debugger */
 
-    JdwpEventMod            mods[1];        /* MUST be last field in struct */
-} JdwpEvent;
+    JdwpEventMod mods[1];        /* MUST be last field in struct */
+};
 
 /*
  * Allocate an event structure with enough space.
@@ -130,8 +126,4 @@
  */
 bool dvmJdwpSendRequest(JdwpState* state, ExpandBuf* pReq);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_JDWP_JDWPEVENT*/
diff --git a/vm/jdwp/JdwpHandler.cpp b/vm/jdwp/JdwpHandler.cpp
index 7776c83..930d25e 100644
--- a/vm/jdwp/JdwpHandler.cpp
+++ b/vm/jdwp/JdwpHandler.cpp
@@ -1713,12 +1713,12 @@
 typedef JdwpError (*JdwpRequestHandler)(JdwpState* state,
     const u1* buf, int dataLen, ExpandBuf* reply);
 
-typedef struct {
+struct JdwpHandlerMap {
     u1  cmdSet;
     u1  cmd;
     JdwpRequestHandler  func;
     const char* descr;
-} JdwpHandlerMap;
+};
 
 /*
  * Map commands to functions.
diff --git a/vm/jdwp/JdwpHandler.h b/vm/jdwp/JdwpHandler.h
index 4486c9d..aade65d 100644
--- a/vm/jdwp/JdwpHandler.h
+++ b/vm/jdwp/JdwpHandler.h
@@ -22,19 +22,15 @@
 #include "Common.h"
 #include "ExpandBuf.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * JDWP message header for a request.
  */
-typedef struct JdwpReqHeader {
+struct JdwpReqHeader {
     u4  length;
     u4  id;
     u1  cmdSet;
     u1  cmd;
-} JdwpReqHeader;
+};
 
 /*
  * Process a request from the debugger.
@@ -48,8 +44,4 @@
 /* helper function */
 void dvmJdwpAddLocation(ExpandBuf* pReply, const JdwpLocation* pLoc);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_JDWP_JDWPHANDLER*/
diff --git a/vm/jdwp/JdwpPriv.h b/vm/jdwp/JdwpPriv.h
index 8d78bbc..6b15fa9 100644
--- a/vm/jdwp/JdwpPriv.h
+++ b/vm/jdwp/JdwpPriv.h
@@ -28,10 +28,6 @@
 #include <pthread.h>
 #include <sys/uio.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * JDWP constants.
  */
@@ -47,14 +43,12 @@
  * Transport-specific network status.
  */
 struct JdwpNetState;
-typedef struct JdwpNetState JdwpNetState;
-
 struct JdwpState;
 
 /*
  * Transport functions.
  */
-typedef struct JdwpTransport {
+struct JdwpTransport {
     bool (*startup)(struct JdwpState* state, const JdwpStartupParams* pParams);
     bool (*accept)(struct JdwpState* state);
     bool (*establish)(struct JdwpState* state);
@@ -67,7 +61,7 @@
     bool (*sendRequest)(struct JdwpState* state, ExpandBuf* pReq);
     bool (*sendBufferedRequest)(struct JdwpState* state,
         const struct iovec* iov, int iovcnt);
-} JdwpTransport;
+};
 
 const JdwpTransport* dvmJdwpSocketTransport();
 const JdwpTransport* dvmJdwpAndroidAdbTransport();
@@ -180,8 +174,4 @@
     return (*state->transport->sendBufferedRequest)(state, iov, iovcnt);
 }
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_JDWP_JDWPPRIV*/
diff --git a/vm/mterp/Mterp.h b/vm/mterp/Mterp.h
index 2dbc325..d68e0b1 100644
--- a/vm/mterp/Mterp.h
+++ b/vm/mterp/Mterp.h
@@ -26,15 +26,11 @@
 #include "interp/Jit.h"
 #endif
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Call this during initialization to verify that the values in asm-constants.h
  * are still correct.
  */
-bool dvmCheckAsmConstants(void);
+extern "C" bool dvmCheckAsmConstants(void);
 
 /*
  * Local entry and exit points.  The platform-specific implementation must
@@ -46,17 +42,13 @@
  *
  * The "mterp" interpreter is always "standard".
  */
-bool dvmMterpStdRun(Thread* self);
-void dvmMterpStdBail(Thread* self, bool changeInterp);
+extern "C" bool dvmMterpStdRun(Thread* self);
+extern "C" void dvmMterpStdBail(Thread* self, bool changeInterp);
 
 /*
  * Helper for common_printMethod(), invoked from the assembly
  * interpreter.
  */
-void dvmMterpPrintMethod(Method* method);
-
-#ifdef __cplusplus
-}
-#endif
+extern "C" void dvmMterpPrintMethod(Method* method);
 
 #endif /*_DALVIK_MTERP_MTERP*/
diff --git a/vm/mterp/common/FindInterface.h b/vm/mterp/common/FindInterface.h
index a640adb..72d45ff 100644
--- a/vm/mterp/common/FindInterface.h
+++ b/vm/mterp/common/FindInterface.h
@@ -17,9 +17,7 @@
 /* common includes */
 #include "Dalvik.h"
 
-#ifdef __cplusplus
 extern "C" {
-#endif
 
 /*
  * Look up an interface on a class using the cache.
@@ -40,6 +38,4 @@
 #undef ATOMIC_CACHE_CALC
 }
 
-#ifdef __cplusplus
 }
-#endif
diff --git a/vm/native/InternalNative.h b/vm/native/InternalNative.h
index 4d32de2..e6b210d 100644
--- a/vm/native/InternalNative.h
+++ b/vm/native/InternalNative.h
@@ -17,10 +17,6 @@
 #ifndef _DALVIK_NATIVE_INTERNALNATIVE
 #define _DALVIK_NATIVE_INTERNALNATIVE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Some setup for internal native functions.
  */
@@ -31,10 +27,6 @@
 DalvikNativeFunc dvmLookupInternalNativeMethod(const Method* method);
 
 /* exception-throwing stub for abstract methods (DalvikNativeFunc) */
-void dvmAbstractMethodStub(const u4* args, JValue* pResult);
-
-#ifdef __cplusplus
-}
-#endif
+extern "C" void dvmAbstractMethodStub(const u4* args, JValue* pResult);
 
 #endif /*_DALVIK_NATIVE_INTERNALNATIVE*/
diff --git a/vm/native/InternalNativePriv.h b/vm/native/InternalNativePriv.h
index 35ab44c..440e60d 100644
--- a/vm/native/InternalNativePriv.h
+++ b/vm/native/InternalNativePriv.h
@@ -20,10 +20,6 @@
 #ifndef _DALVIK_NATIVE_INTERNALNATIVEPRIV
 #define _DALVIK_NATIVE_INTERNALNATIVEPRIV
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Return macros.  Note we use "->i" instead of "->z" for boolean; this
  * is because the interpreter expects everything to be a 32-bit value.
@@ -116,8 +112,4 @@
 extern const DalvikNativeMethod dvm_org_apache_harmony_dalvik_NativeTestTarget[];
 extern const DalvikNativeMethod dvm_sun_misc_Unsafe[];
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_NATIVE_INTERNALNATIVEPRIV*/
diff --git a/vm/native/dalvik_system_DexFile.cpp b/vm/native/dalvik_system_DexFile.cpp
index e4bf5cd..59dddfc 100644
--- a/vm/native/dalvik_system_DexFile.cpp
+++ b/vm/native/dalvik_system_DexFile.cpp
@@ -34,14 +34,14 @@
 /*
  * Internal struct for managing DexFile.
  */
-typedef struct DexOrJar {
+struct DexOrJar {
     char*       fileName;
     bool        isDex;
     bool        okayToFree;
     RawDexFile* pRawDexFile;
     JarFile*    pJarFile;
     u1*         pDexMemory; // malloc()ed memory, if any
-} DexOrJar;
+};
 
 /*
  * (This is a dvmHashTableFree callback.)
diff --git a/vm/oo/AccessCheck.h b/vm/oo/AccessCheck.h
index 8633d89..105c9e1 100644
--- a/vm/oo/AccessCheck.h
+++ b/vm/oo/AccessCheck.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_OO_ACCESSCHECK
 #define _DALVIK_OO_ACCESSCHECK
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Determine whether the "accessFrom" class is allowed to get at "clazz".
  */
@@ -44,8 +40,4 @@
  */
 bool dvmInSamePackage(const ClassObject* class1, const ClassObject* class2);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_OO_ACCESSCHECK*/
diff --git a/vm/oo/Array.h b/vm/oo/Array.h
index 3f8f253..9a5df52 100644
--- a/vm/oo/Array.h
+++ b/vm/oo/Array.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_OO_ARRAY
 #define _DALVIK_OO_ARRAY
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Find a matching array class.  If it doesn't exist, create it.
  *
@@ -45,7 +41,7 @@
  *
  * Returns NULL with an exception raised if allocation fails.
  */
-ArrayObject* dvmAllocArrayByClass(ClassObject* arrayClass,
+extern "C" ArrayObject* dvmAllocArrayByClass(ClassObject* arrayClass,
     size_t length, int allocFlags);
 
 /*
@@ -141,8 +137,4 @@
  */
 size_t dvmArrayClassElementWidth(const ClassObject* clazz);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_OO_ARRAY*/
diff --git a/vm/oo/Class.cpp b/vm/oo/Class.cpp
index 2311f8a..259146b 100644
--- a/vm/oo/Class.cpp
+++ b/vm/oo/Class.cpp
@@ -937,10 +937,10 @@
  */
 
 /* search for these criteria in the Class hash table */
-typedef struct ClassMatchCriteria {
+struct ClassMatchCriteria {
     const char* descriptor;
     Object*     loader;
-} ClassMatchCriteria;
+};
 
 #define kInitLoaderInc  4       /* must be power of 2 */
 
diff --git a/vm/oo/Class.h b/vm/oo/Class.h
index 83f6622..025989e 100644
--- a/vm/oo/Class.h
+++ b/vm/oo/Class.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_OO_CLASS
 #define _DALVIK_OO_CLASS
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * The classpath and bootclasspath differ in that only the latter is
  * consulted when looking for classes needed by the VM.  When searching
@@ -39,19 +35,19 @@
  * Ordering is significant.  (Currently only ".dex" is supported directly
  * by the VM.)
  */
-typedef enum {
+enum ClassPathEntryKind {
     kCpeUnknown = 0,
     kCpeDir,
     kCpeJar,
     kCpeDex,
     kCpeLastEntry       /* used as sentinel at end of array */
-} ClassPathEntryKind;
+};
 
-typedef struct ClassPathEntry {
+struct ClassPathEntry {
     ClassPathEntryKind kind;
     char*   fileName;
     void*   ptr;            /* JarFile* or DexFile* */
-} ClassPathEntry;
+};
 
 bool dvmClassStartup(void);
 void dvmClassShutdown(void);
@@ -134,7 +130,7 @@
 /*
  * Initialize a class.
  */
-bool dvmInitClass(ClassObject* clazz);
+extern "C" bool dvmInitClass(ClassObject* clazz);
 
 /*
  * Retrieve the system class loader.
@@ -287,8 +283,4 @@
  */
 size_t dvmClassObjectSize(const ClassObject *clazz);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_OO_CLASS*/
diff --git a/vm/oo/Object.h b/vm/oo/Object.h
index 55c4d1a..abc819a 100644
--- a/vm/oo/Object.h
+++ b/vm/oo/Object.h
@@ -24,10 +24,6 @@
 #include <stddef.h>
 #include "Atomic.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* fwd decl */
 struct DataObject;
 struct InitiatingLoaderList;
@@ -41,18 +37,6 @@
 struct InstField;
 struct Field;
 struct RegisterMap;
-typedef struct DataObject DataObject;
-typedef struct InitiatingLoaderList InitiatingLoaderList;
-typedef struct ClassObject ClassObject;
-typedef struct StringObject StringObject;
-typedef struct ArrayObject ArrayObject;
-typedef struct Method Method;
-typedef struct ExceptionEntry ExceptionEntry;
-typedef struct LineNumEntry LineNumEntry;
-typedef struct StaticField StaticField;
-typedef struct InstField InstField;
-typedef struct Field Field;
-typedef struct RegisterMap RegisterMap;
 
 /*
  * Native function pointer type.
@@ -70,16 +54,16 @@
 
 
 /* vm-internal access flags and related definitions */
-typedef enum AccessFlags {
+enum AccessFlags {
     ACC_MIRANDA         = 0x8000,       // method (internal to VM)
     JAVA_FLAGS_MASK     = 0xffff,       // bits set from Java sources (low 16)
-} AccessFlags;
+};
 
 /* Use the top 16 bits of the access flags field for
  * other class flags.  Code should use the *CLASS_FLAG*()
  * macros to set/get these flags.
  */
-typedef enum ClassFlags {
+enum ClassFlags {
     CLASS_ISFINALIZABLE        = (1<<31), // class/ancestor overrides finalize()
     CLASS_ISARRAY              = (1<<30), // class is a "[*"
     CLASS_ISOBJECTARRAY        = (1<<29), // class is a "[L*" or "[[*"
@@ -96,7 +80,7 @@
     /* unlike the others, these can be present in the optimized DEX file */
     CLASS_ISOPTIMIZED          = (1<<17), // class may contain opt instrs
     CLASS_ISPREVERIFIED        = (1<<16), // class has been pre-verified
-} ClassFlags;
+};
 
 /* bits we can reasonably expect to see set in a DEX access flags field */
 #define EXPECTED_FILE_FLAGS \
@@ -121,9 +105,9 @@
  * Use the top 16 bits of the access flags field for other method flags.
  * Code should use the *METHOD_FLAG*() macros to set/get these flags.
  */
-typedef enum MethodFlags {
+enum MethodFlags {
     METHOD_ISWRITABLE       = (1<<31),  // the method's code is writable
-} MethodFlags;
+};
 
 /*
  * Get/set method flags.
@@ -141,7 +125,7 @@
     ((u4)((method)->accessFlags & (flags)))
 
 /* current state of the class, increasing as we progress */
-typedef enum ClassStatus {
+enum ClassStatus {
     CLASS_ERROR         = -1,
 
     CLASS_NOTREADY      = 0,
@@ -152,7 +136,7 @@
     CLASS_VERIFIED      = 5,    /* logically part of linking; done pre-init */
     CLASS_INITIALIZING  = 6,    /* class init in progress */
     CLASS_INITIALIZED   = 7,    /* ready to go */
-} ClassStatus;
+};
 
 /*
  * Definitions for packing refOffsets in ClassObject.
@@ -196,7 +180,7 @@
 /*
  * Used for iftable in ClassObject.
  */
-typedef struct InterfaceEntry {
+struct InterfaceEntry {
     /* pointer to interface class */
     ClassObject*    clazz;
 
@@ -205,7 +189,7 @@
      * which holds the vtables for all interfaces declared by this class.
      */
     int*            methodIndexArray;
-} InterfaceEntry;
+};
 
 
 
@@ -221,7 +205,7 @@
  *
  * All objects have an Object header followed by type-specific data.
  */
-typedef struct Object {
+struct Object {
     /* ptr to class object */
     ClassObject*    clazz;
 
@@ -230,7 +214,7 @@
      * the comments in Sync.c for a description of its layout.
      */
     u4              lock;
-} Object;
+};
 
 /*
  * Properly initialize an Object.
@@ -793,8 +777,4 @@
 /* debugging */
 void dvmDumpObject(const Object* obj);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_OO_OBJECT*/
diff --git a/vm/oo/ObjectInlines.h b/vm/oo/ObjectInlines.h
index 1579a56..ef01834 100644
--- a/vm/oo/ObjectInlines.h
+++ b/vm/oo/ObjectInlines.h
@@ -20,10 +20,6 @@
 #ifndef _DALVIK_OO_OBJECTINLINES
 #define _DALVIK_OO_OBJECTINLINES
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * Store a single value in the array, and if the value isn't null,
  * note in the write barrier.
@@ -358,8 +354,4 @@
     }
 }
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_OO_OBJECTINLINES*/
diff --git a/vm/oo/Resolve.h b/vm/oo/Resolve.h
index 1403e77..5eb6814 100644
--- a/vm/oo/Resolve.h
+++ b/vm/oo/Resolve.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_OO_RESOLVE
 #define _DALVIK_OO_RESOLVE
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * "Direct" and "virtual" methods are stored independently.  The type of call
  * used to invoke the method determines which list we search, and whether
@@ -31,13 +27,13 @@
  * (<clinit>, <init>, and methods declared "private" or "static" are stored
  * in the "direct" list.  All others are stored in the "virtual" list.)
  */
-typedef enum MethodType {
+enum MethodType {
     METHOD_UNKNOWN  = 0,
     METHOD_DIRECT,      // <init>, private
     METHOD_STATIC,      // static
     METHOD_VIRTUAL,     // virtual, super
     METHOD_INTERFACE    // interface
-} MethodType;
+};
 
 /*
  * Resolve a class, given the referring class and a constant pool index
@@ -47,8 +43,9 @@
  *
  * Throws an exception and returns NULL on failure.
  */
-ClassObject* dvmResolveClass(const ClassObject* referrer, u4 classIdx,
-    bool fromUnverifiedConstant);
+extern "C" ClassObject* dvmResolveClass(const ClassObject* referrer,
+                                        u4 classIdx,
+                                        bool fromUnverifiedConstant);
 
 /*
  * Resolve a direct, static, or virtual method.
@@ -58,8 +55,8 @@
  *
  * Throws an exception and returns NULL on failure.
  */
-Method* dvmResolveMethod(const ClassObject* referrer, u4 methodIdx,
-    MethodType methodType);
+extern "C" Method* dvmResolveMethod(const ClassObject* referrer, u4 methodIdx,
+                                    MethodType methodType);
 
 /*
  * Resolve an interface method.
@@ -73,7 +70,8 @@
  *
  * Throws an exception and returns NULL on failure.
  */
-InstField* dvmResolveInstField(const ClassObject* referrer, u4 ifieldIdx);
+extern "C" InstField* dvmResolveInstField(const ClassObject* referrer,
+                                          u4 ifieldIdx);
 
 /*
  * Resolve a static field.
@@ -82,22 +80,19 @@
  *
  * Throws an exception and returns NULL on failure.
  */
-StaticField* dvmResolveStaticField(const ClassObject* referrer, u4 sfieldIdx);
+extern "C" StaticField* dvmResolveStaticField(const ClassObject* referrer,
+                                              u4 sfieldIdx);
 
 /*
  * Resolve a "const-string" reference.
  *
  * Throws an exception and returns NULL on failure.
  */
-StringObject* dvmResolveString(const ClassObject* referrer, u4 stringIdx);
+extern "C" StringObject* dvmResolveString(const ClassObject* referrer, u4 stringIdx);
 
 /*
  * Return debug string constant for enum.
  */
 const char* dvmMethodTypeStr(MethodType methodType);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_OO_RESOLVE*/
diff --git a/vm/oo/TypeCheck.h b/vm/oo/TypeCheck.h
index 07bae47..6ffdfe8 100644
--- a/vm/oo/TypeCheck.h
+++ b/vm/oo/TypeCheck.h
@@ -19,18 +19,14 @@
 #ifndef _DALVIK_OO_TYPECHECK
 #define _DALVIK_OO_TYPECHECK
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* VM startup/shutdown */
 bool dvmInstanceofStartup(void);
 void dvmInstanceofShutdown(void);
 
 
 /* used by dvmInstanceof; don't call */
-int dvmInstanceofNonTrivial(const ClassObject* instance,
-    const ClassObject* clazz);
+extern "C" int dvmInstanceofNonTrivial(const ClassObject* instance,
+                                       const ClassObject* clazz);
 
 /*
  * Determine whether "instance" is an instance of "clazz".
@@ -76,11 +72,7 @@
  *
  * Returns 0 (false) if not, 1 (true) if so.
  */
-bool dvmCanPutArrayElement(const ClassObject* elemClass,
+extern "C" bool dvmCanPutArrayElement(const ClassObject* elemClass,
     const ClassObject* arrayClass);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_OO_TYPECHECK*/
diff --git a/vm/reflect/Annotation.cpp b/vm/reflect/Annotation.cpp
index e0b91f4..6b33af3 100644
--- a/vm/reflect/Annotation.cpp
+++ b/vm/reflect/Annotation.cpp
@@ -283,11 +283,11 @@
  * constants for processAnnotationValue indicating what style of
  * result is wanted
  */
-typedef enum {
+enum AnnotationResultStyle {
     kAllObjects,         /* return everything as an object */
     kAllRaw,             /* return everything as a raw value or index */
     kPrimitivesOrObjects /* return primitives as-is but the rest as objects */
-} AnnotationResultStyle;
+};
 
 /*
  * Recursively process an annotation value.
diff --git a/vm/reflect/Reflect.h b/vm/reflect/Reflect.h
index 21523eb..63260b5 100644
--- a/vm/reflect/Reflect.h
+++ b/vm/reflect/Reflect.h
@@ -19,10 +19,6 @@
 #ifndef _DALVIK_REFLECT_REFLECT
 #define _DALVIK_REFLECT_REFLECT
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * During startup, validate the "box" classes, e.g. java/lang/Integer.
  */
@@ -216,23 +212,23 @@
  * Used to pass values out of annotation (and encoded array) processing
  * functions.
  */
-typedef struct AnnotationValue {
+struct AnnotationValue {
     JValue  value;
     u1      type;
-} AnnotationValue;
+};
 
 
 /**
  * Iterator structure for iterating over DexEncodedArray instances. The
  * structure should be treated as opaque.
  */
-typedef struct {
+struct EncodedArrayIterator {
     const u1* cursor;                    /* current cursor */
     u4 elementsLeft;                     /* number of elements left to read */
     const DexEncodedArray* encodedArray; /* instance being iterated over */
     u4 size;                             /* number of elements in instance */
     const ClassObject* clazz;            /* class to resolve with respect to */
-} EncodedArrayIterator;
+};
 
 /**
  * Initializes an encoded array iterator.
@@ -264,8 +260,4 @@
 bool dvmEncodedArrayIteratorGetNext(EncodedArrayIterator* iterator,
         AnnotationValue* value);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif /*_DALVIK_REFLECT_REFLECT*/