安卓studio jni调用第三方静态库CMakeLists配置

    通过CMakeLists调用第三方静态库需要加入以下CMake配置:
add_library( mytaglib #这是我即将调用第三方静态库,不需要写完整的静态库名。
             STATIC
             IMPORTED )
set_target_properties( mytaglib
                       PROPERTIES IMPORTED_LOCATION
                       ${CMAKE_SOURCE_DIR}/libs/x86/libmytaglib.a )  #libmytaglib.a是完整的库名。
target_link_libraries( mediafile-lib  #这是我自己创建的动态库。
                       mytaglib
                       #z             #有人说要加个z库。其实不加也可以编译通过,并且能运行;加了也没有报错。

                       ${log-lib} )   #这是NDK库文件
build.gradle(app)里面也有一项必要的配置:
        externalNativeBuild {
            cmake {
                arguments '-DANDROID_PLATFORM=android-23',
                        '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
            }
        }
build.gradle(app)的配置里面少了上面这一段,就会导致编译不通过(目前我发现上面这一段仅仅是针对调用静态库的时候需要用到)。
    
    其实这一套配置的作用是把第三方静态库mytaglib导入到我自己创建的动态库mediafile_lib中,然后主程序里面通过
static {
        System.loadLibrary("mediafile-lib");
    }
上面这一段程序就可以通过jni调用mytaglib的库函数了。
    下面是我CMakeLists的完整配置和build.gradle(app)的部分配置:

CMakeLists:
add_library( mediafile-lib  #我创建的动态库
             SHARED
             src/main/java/com_citos_ax5mediaplayer_MediaFileScanner.h
             src/main/cpp/native-lib.cpp)

#第三方静态库是提供了头文件的,但是很奇怪的是我这里并没有对头文件进行引用,jni里面通过#include依旧是能使用的。
#include_directories( src/main/cpp/include/ )
add_library( mytaglib       #我调用的第三方静态库
             STATIC         #注意这里的STATIC关键词和下面的IMPORTED关键词,必须这么用
             IMPORTED )
set_target_properties( mytaglib
                       PROPERTIES IMPORTED_LOCATION
                       ${CMAKE_SOURCE_DIR}/libs/x86/libmytaglib.a )

find_library( log-lib
              log )

target_link_libraries( mediafile-lib
                       mytaglib
                       #z

                       ${log-lib} )
build.gradle(app):
...
android {
    ...
    defaultConfig {
        ndk {
            ldLibs "log"//实现__android_log_print
            abiFilters 'x86'//, 'armeabi-v7a'  //我的库是x86的,所以这里需要过滤一下
        }
        ...
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
        externalNativeBuild {
            cmake {
                arguments '-DANDROID_PLATFORM=android-23',
                        '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
            }
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}
...

你可能感兴趣的:(JNI)