zoukankan      html  css  js  c++  java
  • 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");
        }
    
        public  static 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
        return  third_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());
    }
    
    
    }

    这里编译好一个自己写一个libthird.so库实现一个加法功能

    third.h

    #ifndef __H_THIRD
    #define __H_THIRD
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int 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;
    };

    生成如下

     项目工程结构如下:

    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(third  PROPERTIES IMPORTED_LOCATION ${third_path})
    
    MESSAGE(STATUS “src  third 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'
    }
  • 相关阅读:
    一个配置引发的血案
    软件工程之学习方法篇
    开篇
    重拾《 两周自制脚本语言 》- 中文关键字与原生函数
    重拾《 两周自制脚本语言 》- 支持中文标识符
    将《 两周自制脚本语言 》测试中使用的接口中文化
    5分钟入门LingaScript-尝鲜中文版TypeScript
    为《 两周自制脚本语言 》添加中文测试代码
    2019-02-18 扩展Python控制台实现中文反馈信息之二-正则替换
    2019-02-14 1992年日本对母语编程的可读性比较实验
  • 原文地址:https://www.cnblogs.com/mingfeng002/p/7223834.html
Copyright © 2011-2022 走看看