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

  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6168648.html
Copyright © 2011-2022 走看看