1. 程式人生 > >【專案知識點彙總】二、JNI程式碼編譯方式camke 和 ndk 方式 -- Android Studio 操作

【專案知識點彙總】二、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)