Dos formas de compilar la configuración de android studio ndk (ndk-build y cmake)

Android usa armeabi-v7a de forma predeterminada

1.ndk-build

Cargue el código de la capa JNI 1.java dinámicamente
:

    static {
    
    
        System.loadLibrary("MyLibrary"); // libxxx.so库的  libMyLibrary.so
    }

2. jni C ++
(1) Cree un nuevo directorio jni en el directorio principal, el .cpp en él eventualmente generará una biblioteca .so y lo cargará en el apk

在这里插入代码片

(2) Cree el script de compilación del archivo Android.mk Application.mk

Android.mk

    #每个Android.mk文件必须以LOCAL_PATH开头,在整个开发中,它通常别用做定位资源文件,例如,功能宏my-dir提供给编译系统当前的路径。
    LOCAL_PATH := $(call my-dir)
    
    #CLEAR_VARS指编译系统提供一个特殊的GUN MakeFile来为你清除所有的LOCAL_XXX变量,LOCAL_PATH不会被清除。使用这个变量是因为在编译系统时,所有的控制文件都会在一个GUN Make上下文进行执行,而在此上下文中所有的LOCAL_XXX都是全局的。
    include $(CLEAR_VARS)
    
    #LOCAL_MODULE变量是为了确定模块名,并且必须要定义。这个名字必须是唯一的同时不能含有空格。会自动的为文件添加适当的前缀或后缀,模块名为“foo”它将会生成一个名为“libfoo.so”文件。
    LOCAL_MODULE := myjni
    
    #包含一系列被编译进模块的C 或C++资源文件
    LOCAL_SRC_FILES := JNI_C++.cpp
    
    #指明一个GUN Makefile脚本,并且收集从最近“include$(CLEAR_VARS)”下的所有LOCALL_XXX变量的信息,最后告诉编译系统如何正确的进行编译。将会生成一个静态库hello-jni.a文件或者动态库libhello-jni.so。
    include $(BUILD_SHARED_LIBRARY)

Resumen:
LOCAL_PATH es el directorio donde se llama al comando. En qué directorio usa el comando cmd, aquí se devolverá su dirección de ruta.
LOCAL_MODULE ¿Cuál es el nombre del archivo que generó. Después de la salida, automáticamente agregará lib y antes y después del nombre.
LOCAL_SRC_FILES qué archivo compilar

Application.mk
no está disponible. Especifica principalmente el nombre de la biblioteca y el compilado correspondiente a la plataforma de la CPU.
De lo contrario, puede configurarlo en build.gradle. En este momento, use el sistema para compilar en lugar de usar ndk -construir

    APP_MODULES := MyJni
    APP_ABI := all all代表全平台

3. Selección del método de compilación :
configure el nombre del archivo de la biblioteca (el nombre del archivo generado) en build.gradle en el directorio del módulo de la aplicación. Busque el elemento defaultConfig del archivo gradle y agregue el siguiente contenido:

//第一种是将c++ 文件生成.so 库
defaultConfig {
    
     
    ...... 
    //1.指定生成模块名,架构
    ndk{
    
     
        moduleName "JniLibName"  //生成的so名字
        ldLibs "log", "z", "m"  //添加依赖库文件,如果有log打印等 
        abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定cpu体系结构下的so库。 
    } 
}
//2.指定编译Android.mk目录
externalNativeBuild {
    
      
          ndkBuild {
    
     path file("src/main/java/jni/Android.mk") 
    } 
}
//3.指定jni代码目录
sourceSets {
    
          
    main {
    
    
        jni.srcDirs('src/main/java/jni')
    }
}
此种生成的so文件在app/build/intermediates/ndkBuild/debug下



//第二种是 指定将已经有的.so 编译进apk里面
    sourceSets {
    
    
        main {
    
    
            jniLibs.srcDirs('.\\libs')        
            这种是指定.so 文件编译进apk里面,如果在main目录下已经有个JniLibs目录则不用指定,编译时自动会编译进去
        }
    }

2. Método Cmake (de uso común)

Directorio principal / java del mismo nivel jni jniLibs Después de crear estos dos directorios manualmente, no es necesario especificar el directorio del código jni y, por lo tanto, la ruta de la biblioteca en build.gradle.
Inserte la descripción de la imagen aquí

Pasos para la creación del método de Cmake:
1. Configure el modo de compilación de cmake en buidl.gradle, configure la arquitectura de compilación, la fuente y la ruta de la biblioteca
2. Cree CMakeLists.txt en el mismo directorio de nivel (debe especificarse en buidl.gradle)
3. Cree en el directorio jni Create CMakeLists.txt, genere así la biblioteca

(1) build.gradle

android {
    
    
    defaultConfig {
    
    
....
        externalNativeBuild {
    
    
            cmake {
    
    
                cppFlags ""
            }
        }
        ndk {
    
     //设置打包时只编译so库armeabi-v7a
           moduleName "MyLibrary"
           abiFilters  'armeabi-v7a', 'arm64-v8a' ,'x86', 'x86_64'  
        }
    }
  externalNativeBuild {
    
     //设置cmake编译脚本
        cmake {
    
    
            path "CMakeLists.txt"
        }
    }
    sourceSets {
    
     //注意如果自己在src/java创建了 jni jniLibs则不用指定,根据需要自己设定
        main {
    
    
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java', 'src/main/aidl']
            resources.srcDirs = ['src/main/java', 'src/main/aidl']
            aidl.srcDirs = ['src/main/aidl']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
            jni.srcDirs = ['src/main/jni', 'src/main/native']
            jniLibs.srcDirs 'src/main/jniLibs'
        }
    }

}

(2) Cree CMakeLists.txt en el mismo directorio de nivel que build

cmake_minimum_required(VERSION 3.4.1)
#添加子目录, 调用子目录中的CMakeLists.txt
set(JNI_PATH ${
    
    CMAKE_CURRENT_SOURCE_DIR}/src/main/jni)
add_subdirectory(${
    
    JNI_PATH})

(3) Cree CMakeLists.txt en src / main jni para generar la biblioteca de modo

cmake_minimum_required(VERSION 3.4.1)
。。。。

Supongo que te gusta

Origin blog.csdn.net/weixin_41477306/article/details/107800170
Recomendado
Clasificación