Uso de notas de desarrollo de CMake para JNI en el desarrollo de proyectos de Android

Quería hacer una demostración para la práctica de JNI. Como estaba usando un proyecto creado previamente y C++ no estaba incluido al crear el proyecto, revisé el artículo "Uso de CMake para el desarrollo de JNI (Android Studio)" en Android Notes . Siguiendo los pasos de este artículo, era posible antes, pero se produjo un error de configuración durante la compilación. Finalmente, encontré que el proyecto de sincronización de Android Studio falló: Problemas de compilación nativa externa: Error de configuración , que decía que era un problema con el complemento Gradle. en la versión, así que cambié el gradle. La versión del complemento resuelve el problema.

El entorno actual y los pasos de implementación se vuelven a registrar aquí para compararlos y actualizarlos en el futuro.

ambiente:

El complemento gradle de Android Studio 3.1.4
es 3.2.1 , que se puede ver en build.gradle en el directorio raíz del proyecto.

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'  // gradle插件版本
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
Agregar pasos

1. Agregar CMakeLists.txt
2. Configuración del módulo CMakeLists.txt
3. Escribir archivo C/CPP
4.llamada java

Aquí se supone que el archivo C++ JniLib.cpp se ha escrito en src/main/cpp
Insertar descripción de la imagen aquí

1. Cree un nuevo CMakeLists.txt en el módulo del proyecto.
Aquí tomamos el módulo de la aplicación como ejemplo, como se muestra a continuación:
Insertar descripción de la imagen aquí
El contenido de CMakeLists.txt es el siguiente:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)
 
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
			#库名,可修改
             JniLib 

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             # c++源代码文件路径
             src/main/cpp/JniLib.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

# 不是必须添加的
find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

# 不是必须添加的
target_link_libraries( # Specifies the target library.
                       JniLib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

2. El módulo de configuración admite llamadas jni.
Haga clic derecho en el módulo del proyecto, seleccione Vincular proyecto C ++ con Gradle y
Insertar descripción de la imagen aquí
seleccione el archivo CMakeLists.txt recién configurado en el cuadro emergente:
Insertar descripción de la imagen aquí
Espere a que se complete la compilación y El siguiente contenido se generará en el nodo de Android del módulo.

android {
    ...
    externalNativeBuild {
        cmake {
            path 'CMakeLists.txt'
        }
    }
}

Nota: Para los complementos de Gradle inferiores a 3.2.0, se agrega el nodo externalNativeBuild y se informará un error de configuración durante la compilación.

4. Escriba el archivo C/CPP
JniLIb.cpp

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring // 指定方法的返回类型,不设置的话会报错
JNICALL
Java_com_sharedream_demo_activity_JNIDemoActivity_getMessage(
      JNIEnv *env,
      jobject /* this */) {
    
    
  std::string hello = "Hello from C++";
  return env->NewStringUTF(hello.c_str());
}

Nota: Cada método JNI requiere "C" externo JNIEXPORT <tipo JNI> , JNIEXPORT <tipo JNI> se usa para controlar el tipo de retorno de la función; de lo contrario, se informará un error
5.llamada java


public class JNIDemoActivity extends BaseActivity {
    
    

    @BindView(R.id.tv_jni_message)
    TextView tvJNIMessage;

    static {
    
    
        // 1.导入对应的so库
        System.loadLibrary("JniLib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        // 3.调用
        String message = getMessage();
        Logger.d("message = " + message);
        tvJNIMessage.setText(message);
    }

    @Override
    protected int getLayoutId() {
    
    
        return R.layout.activity_jni_demo;
    }

    // 2.声明本地方法
    public static native String getMessage();
}
referencia

Notas de Android: uso de CMake para el desarrollo de JNI (Android Studio)

Supongo que te gusta

Origin blog.csdn.net/fengyulinde/article/details/98237692
Recomendado
Clasificación