【项目知识点汇总】二、JNI代码编译方式camke 和 ndk 方式 -- Android Studio 操作

一、介绍

Android Studio 编译JNI代码有两种方式:cmake 和 ndk 方式

使用感受:

1、cmake方式会受到所用Android sdk版本的影响,主要是ndk的版本影响,没有深入去探究原理

2、ndk方式可以跨Android sdk 版本运行

二、CMAKE方式的配置

说明:1、build.gradle 设置编译方式externalNativeBuild;

2、cmakelist.txt配置需要的cpp文件,和lib名字;

3、如果不需要每次都编译,直接在build.gradle 注释掉,把so文件放到指定目录jniLibs就好

1)修改build.gradle文件

build.gradle 路径

build.gradle 内容

2)修改cmakelist.txt文件

cmakelist.txt 路径

cmakelist.txt 文件内容:需要编译多个路径下的cpp文件,可以采用 file(glob flag "/xxx/*.cpp") 定义好路径,然后在add_library(lib名字  shared 方式参数  ${flag}) $为引用变量的方式,如下图

文件路径

3)取消每次重新编译so文件

取消每次都重新编译so文件,注释如下内容即可

Android studio支持从一个默认的jniLibs的目录获取各个平台的so文件,如下把以前编译好的放置好就行

 

三、NDK方式的配置

说明:1、build.gradle 设置编译方式externalNativeBuild;

2、android.mk配置需要的cpp;

1) build.gradle 设置android里面的ndk moduleName,设置externalNativeBuild配置文件为 android.mk文件路径

2) android.mk文件配置 配置所有cpp文件名称进入src_files

四、源文件

build.gradle

apply plugin: 'com.android.application' 

android {
    compileSdkVersion 26
    defaultConfig { 
       ....//省略 

//        采用cmake编译
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }

//        采用ndk编译
//        ndk {
//            moduleName "prolib"                              //so文件名
//        }
    } 

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

//  采用cmake编译
    externalNativeBuild {
       cmake {
            path "CMakeLists.txt"
       }
    }

//    采用ndk编译
//    externalNativeBuild {
//        ndkBuild {
//            path "src/main/jni/Android.mk"
//        }
//    }

}

cmakelist.txt文件

cmake_minimum_required(VERSION 3.4.1)

file(GLOB native_srcs "src/main/cpp/*.cpp")
file(GLOB native_srcs_xx "src/main/cpp/xx/*.cpp") 

add_library( native-lib
             SHARED
             ${native_srcs}
             ${native_srcs_xx}
             )

find_library( log-lib
              log )

target_link_libraries( native-lib
                       ${log-lib} )

android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := prolib
LOCAL_CPP_EXTENSION := cpp

LOCAL_SRC_FILES :=prolib.cpp xx.cpp\
aa.cpp

LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

猜你喜欢

转载自blog.csdn.net/zishuiyi/article/details/82821195