Reportez-vous à C ++ dans le module Android Studio (Java / kotlin)

La création d'une bibliothèque (format AAR) sur Android est réalisée en créant un module. Cependant, la référence source C ++ dans le module est gênante, je vais donc quitter la procédure. ■ Setp1: créer un projet

2019-05-29 (11).png Créez un projet avec "Fichier", "Nouveau" et "Nouveau projet". 2019-05-29 (12).png Parce qu'il utilise C ++. Sélectionnez "Native C ++" et appuyez sur "Suivant". 2019-05-29 (13).png Cette fois, le nom est "Test02" Save Location spécifie le répertoire à développer La langue est définie en Java cette fois (Kotlin est ok) puis "Next" 2019-05-29 (14).png Après cela, il suffit de "Terminer" 2019-05-29 (15).png Si vous voyez cet écran, vous pouvez créer un projet.

■ Setp2; création de module

2019-05-29 (17).png Ajoutez le module au projet créé par Setp1. Sélectionnez "Fichier" "Nouveau" "Nouveau module". 2019-05-29 (18).png Cette fois, sélectionnez "Bibliothèque Android" et cliquez sur "Suivant" 2019-05-29 (19).png Le nom de l'application / bibliothèque est "test02module" cette fois. Si vous appuyez sur "Terminer" 2019-05-29 (20).png Cela ressemble à ceci, et vous pouvez voir que "test02module" a été ajouté au projet.

■ Setp3: source C ++ ajoutée au module.

Commencez par créer un répertoire pour placer la source C ++. [test02] +---[test02modile]   +---[src]     +---[main]

CMakeList.txt


# 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.
        native-module

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        subTest.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)

set( LIB_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../.. )
set( OUTPUT_DIR ${LIB_ROOT}/lib/${ANDROID_ABI} )
set_target_properties( native-module
        PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIR} )

# 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.
        native-module

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

subTest.cpp


#include "subTest.h"

subTest::subTest() {
}

void subTest::Hoge(int in_no) {
    int a = in_no;
}

subTest.h


#pragma once

class subTest{
public:
    subTest();
public:
    void Hoge(int in_no);
};

Après avoir ajouté ces trois fichiers, éditez build.gradle (Module: test02module). 2019-05-29 (21).png

build.gradle


android {
   :
   :
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}

Ajouter. Une fois que vous avez synchronisé avec cela 2019-05-29 (23).png Vous pouvez voir que le fichier a été ajouté au module.

■ Setp4: appelez le module C depuis l'application C.

Modifiez build.gradle (Module: app) du côté de l'application. 2019-05-29 (27).png

android {
  :
  :
    sourceSets {
        main {
            jniLibs.srcDir '../test02module/src/lib'
            jni.srcDirs = []
        }
    }
}

Vous pouvez maintenant parcourir la bibliothèque C ++ ainsi file. Modifiez "CMakeKists.txt" du côté application. 2019-05-29 (28).png

CMakeKists.txt


# 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.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        native-lib.cpp)

include_directories(../../../../test02module/src/main/cpp)

add_library( native-module
        SHARED
        IMPORTED )
set_target_properties( native-module
        PROPERTIES IMPORTED_LOCATION
        ../../../../../test02module/src/lib/${ANDROID_ABI}/libnative-module.so)

# 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.
        native-lib
        native-module
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

Vous pouvez maintenant vous y référer. C source de l'application native-lib.cpp

native-lib.cpp


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

#include "subTest.h"

extern "C" JNIEXPORT jstring JNICALL
Java_l_toox_test02_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    subTest ss;
    ss.Hoge(32);
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

Vous pouvez vous y référer à.

■ Étape 5: erreur de compilation

Si vous le compilez tel quel, une erreur peut se produire. Parce qu'il n'y a peut-être pas de fichier SO créé 2019-05-29 (26).png Si vous sélectionnez "Build" après avoir sélectionné "test02 modile", "Make Moduke'test02module '" apparaîtra, donc si vous l'exécutez puis exécutez l'application, il n'y a pas de problème.

Recommended Posts

Reportez-vous à C ++ dans le module Android Studio (Java / kotlin)
De Java à C et de C à Java dans Android Studio
AndroidStudio Faisons référence au C ++ dans le module des autres projets (Java / kotlin)
3 façons d'importer des bibliothèques dans Android Studio
[Android Studio] [Java] Comment réparer l'écran verticalement
[Android, Java] Méthode pratique pour calculer la différence en jours
[Android Studio] Je souhaite définir des restrictions sur les valeurs enregistrées dans EditText [Java]
[Android] Convertir le code Java Android en Kotlin
Source pour afficher le tableau de caractères avec numberPicker dans Android Studio (Java)
[Android] Convertissez Map en JSON à l'aide de GSON avec Kotlin et Java
Référence Java à comprendre dans la figure
Convertir toutes les applications Android (Java) en Kotlin
Comment obtenir la date avec Java
Comment utiliser ExpandableListView dans Android Studio
Utilisez le JDK utilisé dans Android Studio dans le terminal
Comment écrire Java String # getBytes dans Kotlin?
Résumer le cycle de vie des objets Java à prendre en compte dans le développement Android
Impressions et doutes sur l'utilisation de Java pour la première fois dans Android Studio
Je suis tombé sur la version Java dans Android Studio, je vais donc le résumer
Remarques sur le studio Android
[Android Studio] Comment changer TextView en n'importe quelle police [Java]
[Java] Comment omettre le constructeur privé dans Lombok
Quel est le meilleur, Kotlin ou futur Java?
Langage Java du point de vue de Kotlin et C #
Source utilisée pour obtenir l'URL de la source de redirection en Java
Classes et instances Java comprises dans la figure
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
Comment utiliser UsageStatsManager dans Android Studio (Comment vérifier l'heure de démarrage d'autres applications)
Comment obtenir le nom d'une classe / méthode exécutée en Java
Comment faire une capture d'écran avec l'émulateur Android Studio
Utilisez Java inclus avec Android Studio pour créer React Native
Reportez-vous à enum dans Thymeleaf
Exemple de code pour obtenir les valeurs des principaux types SQL dans Java + Oracle Database 12c
[Java] Obtenir KClass en Java [Kotlin]
Créer une méthode pour renvoyer le taux de taxe en Java
Vous utilisez actuellement Java 6. Solution dans Android Studio Gradle
Java avec Visual Studio Code
Lorsque vous souhaitez implémenter des tests de bibliothèque Java avec Spock en multi-module avec Gradle dans Android Studio 3
Implémenter la même fonction que C, système C ++ ("cls"); en Java
Comment dériver le dernier jour du mois en Java
Reproduire l'énumération Java en C #
Comment changer Java à l'ère d'OpenJDK sur Mac
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Entrée dans la console Java
Comment utiliser la fonction implémentée dans l'interface de Kotlin introduite dans Maven comme implémentation par défaut de Java 8
J'ai essayé de créer une application cartographique simple dans Android Studio
[Rails / Routing] Comment faire référence au contrôleur dans votre propre répertoire
Je veux revenir à l'écran précédent avec kotlin et java!
Le problème de la réorganisation arbitraire des attributs XML dans Android Studio
[Android, Java] Méthode pour trouver la date écoulée à partir de deux dates
AtCoder ARC 081 C hash à résoudre en Ruby, Perl et Java
[Android Studio] Définir une image arbitraire pour l'arrière-plan de l'application [Java]
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
[Android / Java] Comprendre le type de description dans les paramètres d'écoute (installation du bouton)
Juger si les chaînes de caractères à comparer sont les mêmes en Java
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Exemple de code pour appeler l'API Yahoo! Local Search en Java
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
kotlin & Java: Comment masquer la barre d'outils uniquement pour des fragments spécifiques
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
Comment obtenir la longueur d'un fichier audio avec Java