[JAVA] Utiliser le code natif sur Android

La dernière fois que j'ai expliqué le réglage d'OpenGL ES, cette fois, j'ai pensé que je continuerais, mais j'ai trouvé que le code C / C ++ peut être utilisé sur Android Alors, faites un détour.

Puisque le code d'OpenGL est majoritairement C / C ++, je m'attendais à ce que "les actifs puissent être utilisés!", Mais l'utilisation était plus difficile que je ne l'imaginais. Je n'ai pas encore tout compris, mais voici un résumé de ce que je comprends.

Je n'ai pas beaucoup d'informations sur le dernier Android Studio, donc j'essaie de trouver quelque chose qui ne va pas, alors j'apprécierais que vous puissiez signaler des erreurs.

Préparation

Préparez Android Studio 2.2.

Dans Android Studio 2.2, une case à cocher «Voulez-vous utiliser C / C ++?» S'affiche lors de la création d'un nouveau projet, activez-la d'abord.

c.png

Vérifiez la structure des répertoires

Vérifiez la configuration du nouveau projet. Changez la structure du projet sur la gauche de "Android" à "Projet" afin que vous puissiez voir tous les fichiers.

C'est OK si vous avez les fichiers suivants.

Essayez de construire

Une fois que vous l'avez construit, vous devriez voir un TextView à l'écran. Vous pouvez voir que le code de cpp / native-lib.c est appelé depuis MainActivity.java.

public class MainActivity extends AppCompatActivity {

    // native-lib.c semble être une bibliothèque à la compilation, et je la charge ici.
    //Est-ce quelque chose comme l'importation?
    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 = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * native-lib.Il semble définir la fonction implémentée en c.
     */
    public native String stringFromJNI();
}

Vérifiez native-lib.cpp

Je pense que le code suivant est écrit par défaut. En regardant ce code, Il semble que le package, le nom du projet et le nom de la fonction soient liés par un trait de soulignement. C'est peut-être le format.

Il semble qu'il soit défini par la description. La valeur de retour est également sous la forme de "jstring". Je pense que c'était un type Android NDK ou JNI (interface native Java).

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

extern "C" 
jstring
Java_com_test_opengl_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

Définissons une fonction de test.

Tout d'abord, modifiez comme suit pour que extern "C" soit appliqué à l'ensemble.

extern "C" {

//Mettez la fonction ici.

}

Écrivez une fonction de test selon le cas Les arguments sont standard, alors entrez les mêmes.

extern "C" {

	//La description de stringFromJNI est omise

    void
    Java_quad_jp_opengl_MainActivity_sayHello(JNIEnv *env, jobject){
        std::cout << "Hello World" << std::endl;
    }
}

Bien entendu, la fonction est également définie pour MainActivity.

public native void sayHello();

Quand je l'ai construit, ça s'est terminé sans aucune erreur, je ne savais pas où voir la sortie de cout ... orz

Pour le moment, je sais comment exécuter le processus côté C, modifions donc le code précédent. Je l'ajouterai ici plus tard.

Informations de référence

Android NDK (la page officielle a une méthode de configuration détaillée)

Certaines pages ont été traduites, mais la traduction n'est pas assez bonne et c'est un peu déroutant. Ajout de code C / C ++ au projet

Recommended Posts

Utiliser le code natif sur Android
Utiliser la communication série sur Android
Commentaire ReactNative Android Bridge
Utiliser perltidy sur CentOS 8
[Android] Notes sur xml
Utilisez mod_auth_cas sur CentOS 8
Utiliser Corretto 11 avec Heroku
Utiliser cpplapack avec ubuntu
[Android Studio] Je souhaite utiliser une bibliothèque Maven sur Android
Personnaliser la vue de liste sur Android
Bibliothèque de transmission en plusieurs parties sur Android
Développement d'applications ROS sur Android
Point 66: Utiliser judicieusement les méthodes natives
Utilisez Java inclus avec Android Studio pour créer React Native
Comment utiliser PlantUML avec Visual Studio Code (créé le 30 octobre 2020)
Utiliser PlantUML avec Visual Studio Code
Lire et générer un code QR [Android]
Gestion des événements avec RxBus sur Android
Comment "évider" une vue sur Android
[Android] Obtenez la date du lundi
Utiliser Docker Compose sur Windows 10 Famille
Comment utiliser Ruby on Rails
Comment utiliser les bio-formats sur Ubuntu 20.04
Watson Assistant (anciennement Conversation) sur Android
Remarques sur l'appel du programme d'installation sur l'application Android
Facile à utiliser Cloud Firestore (Android)
Enregistrer ArrayList à l'aide de GSON sur Android
Utilisez la commande iostat sur CentOS 8
Utiliser la complétion dans Eclipse sur Mac
Remarques sur le traitement des threads Android (java)
[Android] Recevoir une intention avec le récepteur de diffusion
[Android] Convertir le code Java Android en Kotlin
Utiliser Docker CE (officiel) avec CentOS 8
Implémenter la représentation ondulatoire dans les images sur Android
Accélérez l'acquisition d'informations de localisation sur Android
Qu'est-ce qui n'était pas une utilisation équitable du détournement d'API Java sur Android?