title: How to fix Android NDK app crash with UnsatisfiedLinkError when loading protobuf-lite.so on Android 6.0?
body: <p>I have created an Android application with a custom C++ library that depends on Google's protobuf-lite library. It works fine on all the recent devices I have tried to run it on (under Android 7, 8 and 8.1). However, I found that on older devices running Android 6.0.1 or 6.0 (Asus Nexus 7 and some old Motorola phone), the application crashes on loading the libprotobuf-lite.so dependency.</p>
  
  <p>Here is the stacktrace I get:</p>
  
  <pre><code>E/AndroidRuntime: FATAL EXCEPTION:
  main Process: com.mycompany.core, PID: 11582 java.lang.UnsatisfiedLinkError:
  dlopen failed: cannot locate symbol "__aeabi_memmove8" referenced by "/data/app/com.mycompany.core-2/lib/arm/libprotobuf-lite.so"...
  at java.lang.Runtime.loadLibrary(Runtime.java:372)
  at java.lang.System.loadLibrary(System.java:1076)
  at com.mycompany.core.CameraTestActivity.&lt;clinit&gt;(CameraTestActivity.java:46)
  at java.lang.Class.newInstance(Native Method)
  at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
  at android.app.ActivityThread.-wrap11(ActivityThread.java)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:148)
  at android.app.ActivityThread.main(ActivityThread.java:5417)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)$
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  </code></pre>
  
  <p>This is really weird because the missing symbol "__aeabi_memmove8" appears to be a low-level standard library feature and I do not really grasp why it would not be found on Android 6.</p>
  
  <p>In addition, I am quite confident that the issue comes from protobuf-lite not linking correctly because previous versions of my app, which were not using protobuf, ran fine on these Android 6 devices.</p>
  
  <p>Below are some details on my config.</p>
  
  <ul>
  <li>Protobuf version: 3.6.1</li>
  <li>Lib package cross-compiled from source using Cmake GUI, NDK r18 toolchain and MinGW</li>
  <li>Devices' ABI: armeabi-v7a</li>
  <li>Android SDK compile version: API 28</li>
  <li>Application build toolchain : Gradle + CMake.</li>
  <li>Android Studio 3.1.3</li>
  </ul>
  
  <p>Here is my build.gradle file:</p>
  
  <pre><code>android {
      compileSdkVersion 28
      defaultConfig {
          applicationId "com.mycompany.core"
          minSdkVersion 21
          targetSdkVersion 28
          versionCode 1
          versionName "1.0"
          testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
          externalNativeBuild {
              cmake {
                  cppFlags "-frtti -fexceptions"
              }
          }
      }
      buildTypes {
          release {
              minifyEnabled true
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  
              ndk{
                  abiFilters "arm64-v8a", "armeabi-v7a"
              }
          }
  
          debug {
              ndk{
                  abiFilters "arm64-v8a", "armeabi-v7a"
              }
          }
      }
      externalNativeBuild {
          cmake {
              path "CMakeLists.txt"
          }
      }
  }
  dependencies {
      implementation fileTree(include: ['*.jar'], dir: 'libs')
      implementation 'com.android.support.constraint:constraint-layout:1.1.3'
      implementation "android.arch.lifecycle:extensions:1.1.0"
      implementation "android.arch.lifecycle:viewmodel:1.1.0"
      testImplementation 'junit:junit:4.12'
      androidTestImplementation 'com.android.support.test:runner:1.0.2'
      androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
  }
  </code></pre>
  
  <p>And here is my CMakeLists.txt file:</p>
  
  <pre><code>cmake_minimum_required(VERSION 3.4.1)
  
  include_directories(src/main/cpp/protobuf/include)
  
  file(GLOB SRCS
      "src/main/cpp/core/*.cpp"
      )
  
  file(GLOB JNI_SRCS
          "src/main/cpp/jni/*.cpp"
          )
  
  add_library(mycorelib SHARED ${SRCS} ${JNI_SRCS})
  
  find_library(log-lib log)
  
  add_library(libprotobuf-lite SHARED IMPORTED)
  
  set_target_properties(libprotobuf-lite
                      PROPERTIES IMPORTED_LOCATION
                      ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libprotobuf-lite.so)
  
  target_link_libraries(mycorelib
                          android
                          jnigraphics
                          ${log-lib}
                          libprotobuf-lite)
  </code></pre>
  
  <p>Has anyone run into this problem before? Any hint on how to fix this would be greatly appreciated.</p>