zoukankan      html  css  js  c++  java
  • Android 开发--CMakeList调用本地so文件

    这里写代码片Android开发常常遇到Java调用so文件的情况,本文介绍一下Google最近新推出的应用在android studio中的方法–cmakelist.txt格式调用。

    so文件分为jni格式的和非jni格式的,java只能调用jni格式的so文件。本文介绍的是针对ndk生成的非jni格式的so文件调用。

    首先是对非jni格式的so文件进行处理,声明一个.h文件,将so文件中的方法包进去,之后将.h文件和so文件放在一个目录下(之后需要对目录进行设置),在系统生成的native-lib.cpp中实现对该so文件的调用,即将.h文件包进去就可以调用so文件中的方法。java采用

    System.loadlibraty("native-lib")

    的方法,即可对native-lib.cpp方法的调用。

    下图是我实例的结构图:

    这里写图片描述

    其关键是CMakeList.txt和app下的gradle的设置

    gradleandroid {
    compileSdkVersion 24
    buildToolsVersion “24.0.3”
    defaultConfig {
    applicationId “com.zfq.anew”
    minSdkVersion 19
    targetSdkVersion 24
    versionCode 1
    versionName “1.0”
    #设置so文件的ABI类型

                abiFilters  'armeabi'
                //abiFilters 'armeabi', 'armeabi-v7a'
            }
    
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            externalNativeBuild {
                cmake {
                    arguments '-DANDROID_PLATFORM=android-19',
                            '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
                }
            }
        }
     buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
    
    // 设置so文件路径
        sourceSets {
            main {
                // let gradle pack the shared library into apk
                //jniLibs.srcDirs = ['../distribution/plus/lib']
                //jniLibs.srcDirs =[]
                jniLibs.srcDirs = ['../distribution/plus/lib']
            }
        }
    //设置cmakelist路径
        externalNativeBuild {
            cmake {
                path "src/main/cpp/CMakeLists.txt"
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:24.2.1'
        testCompile 'junit:junit:4.12'
    }
    

    下面是CMakelist设置

    cmake_minimum_required(VERSION 3.4.1)
    
    **#设置cmakelist的目标路径``**
    
    set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
    #增加Cpp动态共享库
    add_library( native-lib
                 SHARED
                 native-lib.cpp )
    
    #增加so文件动态共享库,${ANDROID_ABI}表示so文件的ABI类型的路径
    add_library(wzh033 SHARED IMPORTED)
    set_target_properties(wzh033  PROPERTIES IMPORTED_LOCATION
    ${distribution_DIR}/plus/lib/${ANDROID_ABI}/libwzh033.so)
    
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
    #增加include包含的路径
    target_include_directories(native-lib PRIVATE
                   ${distribution_DIR}/plus/include)
    #生成链接动态库
    target_link_libraries(    native-lib
                                wzh033
                                android
                              ${log-lib} )

    参考文献:
    (locationNum=6http://blog.csdn.net/eastmoon502136/article/details/52806640)

    http://blog.csdn.net/ddjjll8877/article/details/52670097?

    https://developer.android.com/studio/projects/add-native-code.html#new-project

  • 相关阅读:
    char 转string
    博客,记忆的图谱。
    history
    openstack Icehouse发布
    数据库常用命令
    nagios
    screen
    openstack 流量控制
    sublime 3
    磁盘类型
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6168648.html
Copyright © 2011-2022 走看看