diff --git a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp
index 42284edd14bc9d28f573ed77328c9906becdad46..fb55ea76a839115a3d980cc86258b7da8af41a24 100644
--- a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp
+++ b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp
@@ -21,10 +21,10 @@
 #include "jni_common.h"
 #include "proximity_info.h"
 
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string>
+#include <cassert>
+#include <cerrno>
+#include <cstdio>
+#include <cstring>
 
 namespace latinime {
 
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index 71bef937d112a766c5ac4ee63f3beb89d7ae0dad..435e8379d9c2569b98daa9984394a1bd5b923dc0 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -25,9 +25,9 @@
 #include "jni_common.h"
 #include "proximity_info.h"
 
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
+#include <cassert>
+#include <cerrno>
+#include <cstdio>
 
 #ifdef USE_MMAP_FOR_DICTIONARY
 #include <sys/mman.h>
@@ -36,7 +36,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #else // USE_MMAP_FOR_DICTIONARY
-#include <stdlib.h>
+#include <cstdlib>
 #endif // USE_MMAP_FOR_DICTIONARY
 
 namespace latinime {
diff --git a/native/jni/com_android_inputmethod_latin_NativeUtils.cpp b/native/jni/com_android_inputmethod_latin_NativeUtils.cpp
index 9aae81716616224829768be63bd9688197688066..8f1afbeb6d2f4f8b35a5b51ea657c4089060288a 100644
--- a/native/jni/com_android_inputmethod_latin_NativeUtils.cpp
+++ b/native/jni/com_android_inputmethod_latin_NativeUtils.cpp
@@ -18,7 +18,7 @@
 #include "jni.h"
 #include "jni_common.h"
 
-#include <math.h>
+#include <cmath>
 
 namespace latinime {
 
diff --git a/native/jni/jni_common.cpp b/native/jni/jni_common.cpp
index 4eeda1d4e0904a9726be1cdf2c59ad12f0edc85d..94e279ff9bc121a73c13ac6fad60db7014be8c23 100644
--- a/native/jni/jni_common.cpp
+++ b/native/jni/jni_common.cpp
@@ -23,9 +23,9 @@
 #include "jni.h"
 #include "proximity_info.h"
 
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
+#include <cassert>
+#include <cerrno>
+#include <cstdio>
 
 using namespace latinime;
 
diff --git a/native/jni/jni_common.h b/native/jni/jni_common.h
index 771361d5e9ea8f6e2448002f0a426f710d07255d..658ff18b91aceb5093cbf97b115ee9e2b560e054 100644
--- a/native/jni/jni_common.h
+++ b/native/jni/jni_common.h
@@ -17,8 +17,6 @@
 #ifndef LATINIME_JNI_COMMON_H
 #define LATINIME_JNI_COMMON_H
 
-#include <stdlib.h>
-
 #include "jni.h"
 
 namespace latinime {
diff --git a/native/jni/src/bigram_dictionary.cpp b/native/jni/src/bigram_dictionary.cpp
index 8dc212203b66998ab314fccf687786490644ce63..bc34e4e092d0efade5c8e88d2155b096b08bacf8 100644
--- a/native/jni/src/bigram_dictionary.cpp
+++ b/native/jni/src/bigram_dictionary.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include <string.h>
+#include <cstring>
 
 #define LOG_TAG "LatinIME: bigram_dictionary.cpp"
 
diff --git a/native/jni/src/bigram_dictionary.h b/native/jni/src/bigram_dictionary.h
index f66e27b8abbcd6894ffa579a42128b5d643c5537..d676cca6337c7898c28930ca5d61b211cff4d4f2 100644
--- a/native/jni/src/bigram_dictionary.h
+++ b/native/jni/src/bigram_dictionary.h
@@ -24,7 +24,6 @@
 
 namespace latinime {
 
-class Dictionary;
 class BigramDictionary {
  public:
     BigramDictionary(const unsigned char *dict, int maxWordLength, int maxPredictions);
diff --git a/native/jni/src/char_utils.cpp b/native/jni/src/char_utils.cpp
index 9d2bc85b330ed3db647ee406b4d6ad40dfaf0e41..88803cbcc91f2a3cad4480ba166c5754c71dc081 100644
--- a/native/jni/src/char_utils.cpp
+++ b/native/jni/src/char_utils.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include <stdlib.h>
+#include <cstdlib>
 
 namespace latinime {
 
diff --git a/native/jni/src/correction.cpp b/native/jni/src/correction.cpp
index 74e256fe5f9122d95537589f27987fa3d54a6daf..921ab0a28d481a4022e3e6b8989f55f318c0104b 100644
--- a/native/jni/src/correction.cpp
+++ b/native/jni/src/correction.cpp
@@ -14,11 +14,10 @@
  * limitations under the License.
  */
 
-#include <assert.h>
-#include <ctype.h>
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
+#include <cassert>
+#include <cctype>
+#include <cmath>
+#include <cstring>
 
 #define LOG_TAG "LatinIME: correction.cpp"
 
diff --git a/native/jni/src/correction.h b/native/jni/src/correction.h
index 13f951af5d27bc1dfc656cd99f7242941d25d92a..a7028acf0d0fed82ace1bc5565d04f4f6224f2ad 100644
--- a/native/jni/src/correction.h
+++ b/native/jni/src/correction.h
@@ -17,7 +17,7 @@
 #ifndef LATINIME_CORRECTION_H
 #define LATINIME_CORRECTION_H
 
-#include <assert.h>
+#include <cassert>
 #include <stdint.h>
 
 #include "correction_state.h"
diff --git a/native/jni/src/dictionary.cpp b/native/jni/src/dictionary.cpp
index dabd98b5f136160b31ae00abf6162c4c354d0975..b9f65346e15e4141f85f2abf24bbd9a222bbd851 100644
--- a/native/jni/src/dictionary.cpp
+++ b/native/jni/src/dictionary.cpp
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-#include <stdio.h>
-
 #define LOG_TAG "LatinIME: dictionary.cpp"
 
 #include "binary_format.h"
diff --git a/native/jni/src/proximity_info.cpp b/native/jni/src/proximity_info.cpp
index 393791f97a16f09bdcd00550bc5d4dab2a0d8eb1..53ae1ea2777a9d877e72fb070fe9df5f4f05392f 100644
--- a/native/jni/src/proximity_info.cpp
+++ b/native/jni/src/proximity_info.cpp
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-#include <assert.h>
-#include <math.h>
-#include <stdio.h>
+#include <cassert>
+#include <cmath>
+#include <cstring>
 #include <string>
 
 #define LOG_TAG "LatinIME: proximity_info.cpp"
diff --git a/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp
index d481a3bc7f4d1147a6aeab0edf861ced9518c683..04a2017120de7124c96db0834238cee05873b65c 100644
--- a/native/jni/src/proximity_info_state.cpp
+++ b/native/jni/src/proximity_info_state.cpp
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-#include <assert.h>
+#include <cassert>
 #include <stdint.h>
-#include <string>
 
 #define LOG_TAG "LatinIME: proximity_info_state.cpp"
 
diff --git a/native/jni/src/proximity_info_state.h b/native/jni/src/proximity_info_state.h
index a5fe528c190bed2dcf3d1cb49f65337c929a3f7c..456e3ec089e365cd24c983dfd42e81c867725e33 100644
--- a/native/jni/src/proximity_info_state.h
+++ b/native/jni/src/proximity_info_state.h
@@ -17,7 +17,7 @@
 #ifndef LATINIME_PROXIMITY_INFO_STATE_H
 #define LATINIME_PROXIMITY_INFO_STATE_H
 
-#include <assert.h>
+#include <cassert>
 #include <stdint.h>
 #include <string>
 
diff --git a/native/jni/src/unigram_dictionary.cpp b/native/jni/src/unigram_dictionary.cpp
index ce3108b3b0d03750debddd9ebfcce523da705b0e..b2fc870dd05e19e0eb2e125420519476853b15cc 100644
--- a/native/jni/src/unigram_dictionary.cpp
+++ b/native/jni/src/unigram_dictionary.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include <assert.h>
-#include <string.h>
+#include <cassert>
+#include <cstring>
 
 #define LOG_TAG "LatinIME: unigram_dictionary.cpp"
 
diff --git a/native/jni/src/unigram_dictionary.h b/native/jni/src/unigram_dictionary.h
index f6aef2bfdd2716679e9b137ef633167328304b72..ac17f50ef5e95b6e01ab1b0d4781750d0e96c3c1 100644
--- a/native/jni/src/unigram_dictionary.h
+++ b/native/jni/src/unigram_dictionary.h
@@ -19,16 +19,15 @@
 
 #include <map>
 #include <stdint.h>
-#include "correction.h"
-#include "correction_state.h"
 #include "defines.h"
-#include "proximity_info.h"
-#include "words_priority_queue.h"
-#include "words_priority_queue_pool.h"
 
 namespace latinime {
 
+class Correction;
+class ProximityInfo;
 class TerminalAttributes;
+class WordsPriorityQueuePool;
+
 class UnigramDictionary {
     typedef struct { int first; int second; int replacement; } digraph_t;
 
diff --git a/native/jni/src/words_priority_queue.h b/native/jni/src/words_priority_queue.h
index fc9c55e639c55e177e93703c22c62aa5b5d43dd5..b24cf84704e14e052911bc7bfe63d07af852e412 100644
--- a/native/jni/src/words_priority_queue.h
+++ b/native/jni/src/words_priority_queue.h
@@ -20,6 +20,8 @@
 #include <cstring> // for memcpy()
 #include <iostream>
 #include <queue>
+
+#include "correction.h"
 #include "defines.h"
 
 namespace latinime {
diff --git a/native/jni/src/words_priority_queue_pool.h b/native/jni/src/words_priority_queue_pool.h
index aff307404dbac876f84ab1c3772af9958ddf5712..38887291e2a8568dea34c8d62bdeacab553c98c3 100644
--- a/native/jni/src/words_priority_queue_pool.h
+++ b/native/jni/src/words_priority_queue_pool.h
@@ -17,8 +17,7 @@
 #ifndef LATINIME_WORDS_PRIORITY_QUEUE_POOL_H
 #define LATINIME_WORDS_PRIORITY_QUEUE_POOL_H
 
-#include <assert.h>
-#include <new>
+#include <cassert>
 #include "words_priority_queue.h"
 
 namespace latinime {