How to link a prebuilt shared Library to an Android NDK project?

前端 未结 4 1872
醉话见心
醉话见心 2020-11-27 18:28

Here I used this Android.mk file in jni/ folder.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_PATH := $(call my-dir)
         


        
4条回答
  •  甜味超标
    2020-11-27 18:59

    Android NDK official hello-libs CMake example

    https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs

    Just worked for me on Ubuntu 17.10 host, Android Studio 3, Android SDK 26, NDK 15.2. so I strongly recommend that you base your project on it.

    The shared library is called libgperf, the key code parts are:

    • hello-libs/app/src/main/cpp/CMakeLists.txt:

      // -L
      add_library(lib_gperf SHARED IMPORTED)
      set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
                ${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so)
      
      // -I
      target_include_directories(hello-libs PRIVATE
                                 ${distribution_DIR}/gperf/include)
      // -lgperf
      target_link_libraries(hello-libs
                            lib_gperf)
      
    • on C++ code, use: #include

    • header location: hello-libs/distribution/gperf/include/gperf.h

    • lib location: distribution/gperf/lib/arm64-v8a/libgperf.so

    • app/build.gradle:

      android {
          sourceSets {
              main {
                  // let gradle pack the shared library into apk
                  jniLibs.srcDirs = ['../distribution/gperf/lib']
      

      Then, if you look under /data/app on the device, libgperf.so will be there as well.

    • If you only support some architectures, see: Gradle Build NDK target only ARM

    The example git tracks the prebuilt shared libraries, but it also contains the build system to actually build them as well: https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs/gen-libs

提交回复
热议问题