【專案知識點彙總】二、JNI程式碼編譯方式camke 和 ndk 方式 -- Android Studio 操作
阿新 • • 發佈:2018-12-11
一、介紹
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)