De Java à C et de C à Java dans Android Studio

Il est facile d'appeler C à partir de Java lors de l'utilisation de NDK dans Android Studio, mais parfois je veux appeler Java à partir de C, donc un mémorandum (J'utilise Android Studio 3.4.1) ■ Setp1: créer un projet

2019-05-29 (1).png Créez un projet avec "Fichier" "Nouveau" "Nouveau Projekut" d'Android Studio. 2019-05-29 (3).png Cette fois, je veux appeler C depuis Java, alors sélectionnez "Native C ++" et cliquez sur "Suivant" pour passer à l'écran suivant 2019-05-29 (4).png Le nom est approprié cette fois "test01" Spécifiez le répertoire du projet à créer cette fois avec l'emplacement d'enregistrement La langue est créée en "Java", et lorsque les paramètres sont terminés, cliquez sur "Suivant" pour afficher l'écran suivant. 2019-05-29 (5).png Ici, sélectionnez simplement "Terminer". (Sur cet écran, vous pouvez définir pour utiliser C ++ 11 ou C ++ 14, mais vous pouvez le définir plus tard, alors ignorez-le) 2019-05-29 (6).png Lorsqu'un tel écran apparaît, j'ai pu créer un projet pour le moment. ■ Setp2: Java vers C

Lorsque le projet est créé, il est la source pour appeler C depuis Java. Si vous l'exécutez, "stringFromJNI ()" est appelé depuis "MainActivity", donc "Java_l_toox_test01_MainActivity_stringFromJNI" dans native-lib.cpp est appelé. (Étudions les détails séparément) ■ Étape 3: De C à Java

Ajoutez la fonction "testFunc" appelée de C à [MainActivity.Java].

MainActivity.java


package l.toox.test01;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

    public void testFunc(){
    }
}

Ensuite, la partie qui lit Java à partir de C. Modifiez [Native-lib.cpp] comme suit.

native-lib.cpp


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

extern "C" JNIEXPORT jstring JNICALL
tugini 
        JNIEnv *env,
        jobject in_thiz) {

    jobject my_class = env->NewGlobalRef(in_thiz);
    jclass clazz = env->GetObjectClass(my_class);
    jmethodID mobj = env->GetMethodID( clazz, "testFunc", "()V" );
    env->CallVoidMethod( my_class, mobj );
    env->DeleteLocalRef( clazz );

    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

(Notez que l'argument est jobject in_thiz.)

Si vous l'exécutez avec cela, vous appelez Java à partir de C. 2019-05-29 (10).png Des ruptures peuvent se produire pendant l'exécution du débogage.

Recommended Posts

De Java à C et de C à Java dans Android Studio
Reportez-vous à C ++ dans le module Android Studio (Java / kotlin)
La direction de Java dans "C ++ Design and Evolution"
Comment utiliser ExpandableListView dans Android Studio
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
Remarques sur le studio Android
3 façons d'importer des bibliothèques dans Android Studio
Différences dans l'écriture des classes Java, C # et Javascript
Représente le «jour suivant» et le «jour précédent» en Java / Android
Tri par hachage AtCoder ABC 111 C résolu en Ruby, Perl et Java
[Android / Java] Transition d'écran et traitement de retour par fragments
[Android Studio] Comment changer TextView en n'importe quelle police [Java]
Organiser les builds dans des combinaisons C ++ / Java et Win / Linux
Impressions et doutes sur l'utilisation de Java pour la première fois dans Android Studio
[Android Studio] [Java] Comment réparer l'écran verticalement
Traitement asynchrone et intégration d'API Web dans Android Studio
Classes et instances Java comprises dans la figure
Java avec Visual Studio Code
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Reproduire l'énumération Java en C #
Histoire de remplacement C # et Java
[Android Studio] Je souhaite définir des restrictions sur les valeurs enregistrées dans EditText [Java]
Résolution avec Ruby, Perl et Java AtCoder ABC 113 C Reference
[Java] Changez la langue et les paramètres régionaux en anglais avec les options JVM
Utilisez Java inclus avec Android Studio pour créer React Native
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Comment appeler et utiliser l'API en Java (Spring Boot)
Vous utilisez actuellement Java 6. Solution dans Android Studio Gradle
Raisons d'utiliser séparément Servlet et JSP dans le développement Java
Comment développer et enregistrer une application Sota en Java
Différences dans la gestion des chaînes entre Java et Perl
Essayez d'implémenter Android Hilt en Java
Lire le fichier de propriétés Java en C #
Multithread pour s'adapter au modèle [Java]
Exemple d'encodage et de décodage en Java
Java, JavaScript, C # (différence d'affectation)
Comment apprendre JAVA en 7 jours
CGI en C et Dart: Introduction (1)
Insérez automatiquement `@ SuppressWarnings` dans Android Studio
OkHttp3 (GET, POST) dans Android Studio
[Android Studio] [Java] Mémos et liens d'apprentissage
Enregistrer la sortie dans un fichier en Java
Classe StringBuffer et StringBuilder en Java
Comprendre equals et hashCode en Java
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Essayez d'implémenter Yuma en Java
Réintroduction de Java8, disponible depuis Android Studio 2.4
Crypter avec Java et décrypter avec C #
Bonjour tout le monde en Java et Gradle
Comment concaténer des chaînes avec Java
Lorsque vous souhaitez implémenter des tests de bibliothèque Java avec Spock en multi-module avec Gradle dans Android Studio 3
J'ai essayé de créer une application cartographique simple dans Android Studio
Introduction au développement d'applications Android 1 Installation de JDK et d'Android Studio pour mac
Déterminer si un clavier personnalisé est activé dans Android Studio (Java)
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux