Android Studio CMake依赖第三方库

吾生也有涯,而知也无涯。这篇文章主要讲述Android Studio CMake依赖第三方库相关的知识,希望能为你提供帮助。
  这里实现一个简单的功能在APP里调用libnative-lib.so里的add。libnative-lib.so去调用libthird.so里的third_add来实现

JniUtil

public class JniUtil { static { System.loadLibrary("native-lib"); System.loadLibrary("third"); }publicstatic native int add(int x,int y); }

 
libnative.cpp
#include < jni.h> #include < string> #include "third.h"extern "C"{ JNIEXPORT jint JNICALL java_com_test_ndkthirdso_JniUtil_add(JNIEnv *env, jclass type, jint x, jint y) {// TODO returnthird_add(x,y); }JNIEXPORT jstring JNICALL Java_com_test_ndkthirdso_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { std::string hello = "Hello from C++"; return env-> NewStringUTF(hello.c_str()); }}

 
【Android Studio CMake依赖第三方库】 
 
 
这里编译好一个自己写一个libthird.so库实现一个加法功能
third.h
#ifndef __H_THIRD #define __H_THIRD#ifdef __cplusplus extern "C" { #endifint third_add(int a, int b); #ifdef __cplusplus } #endif#endif // __H_THIRD

third.cpp
#include < jni.h> #include "third.h"int third_add(int a, int b){ return a+b; };

生成如下
Android Studio CMake依赖第三方库

文章图片

 
 
 
  项目工程结构如下:
Android Studio CMake依赖第三方库

文章图片

 
CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1) add_library(native-lib SHARED src/main/cpp/native-lib.cpp )find_library(log-lib log ) #动态方式加载 third是libxxxx.so的xxxx部分 add_library(third SHARED IMPORTED)SET(third_path ${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/${android_ABI}/libthird.so)#设置要连接的so的相对路径,${ANDROID_ABI}表示so文件的ABI类型的路径,这一步引入了动态加入编译的so set_target_properties(thirdPROPERTIES IMPORTED_LOCATION ${third_path})MESSAGE(STATUS “srcthird so path= ${third_path}”)#配置加载native依赖 include_directories( ${ProjectRoot}/app/src/main/cpp/external/include )target_link_libraries(native-lib third ${log-lib} )

 
gradle
apply plugin: \'com.android.application\'android { compileSdkVersion 26 buildToolsVersion "26.0.0" defaultConfig { applicationId "com.test.ndkthirdso" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" } } ndk { // Specifies the ABI configurations of your native // libraries Gradle should build and package with your APK. abiFilters\'armeabi\', \'armeabi-v7a\' } }buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(\'proguard-android.txt\'), \'proguard-rules.pro\' } } externalNativeBuild { cmake { path "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:26.+\' compile \'com.android.support.constraint:constraint-layout:1.0.2\' testCompile \'junit:junit:4.12\' }

 

    推荐阅读