Entrée de développement Android JNI et combat réel

Introduction: Lorsqu'il
s'agit de certains algorithmes ou pilotes sous-jacents, il est souvent nécessaire d'utiliser jni pour développer. Maintenant, il est officiellement recommandé d'utiliser l'outil CMake pour développer jni.
Utiliser CMake pour développer Jni est en fait assez simple. Si les exigences ne sont pas élevées, il suffit de le configurer brièvement.


Environnement de configuration L'
utilisation de CMake pour le développement Jni nécessite l'utilisation de plugins CMake, de plugins LLDB et de plugins NDK, qui peuvent tous être installés rapidement via Android Studio.
Ouvrez SDK Manager, recherchez l'option Android SDK-> SDK Tool, installez le plug-in CMake, LLDB, NDK.


Créer un projet qui prend en charge le code C ++

La valeur par défaut est Suivant, Terminer termine la création du projet

Regardez la configuration sous app build.gradle

CMakeLists.txt sous cpp est un fichier de configuration très important, regardez la configuration à l'intérieur

Jetez un œil au code dans native-lib.cpp, voici l'implémentation spécifique de la méthode clé de JAVA appelant C, et la méthode native déclarée dans le code Java est utilisée ici pour implémenter l'algorithme fonctionnel en C / C ++.

Le chargement de la bibliothèque native-lib et l'appel de méthode sont implémentés dans MainActivity

 

Tellement facile! Ceci complète le développement de base de JNI!

 

Dans l'implémentation spécifique, comment convertir une déclaration de méthode native Java en implémentation C, la méthode est la suivante:

 1. Créez la classe Java Demo.java  

Démo de classe publique {
    public native int addTwo (int a, int b);
    public natif int addMore (int [] nums, int cible);
}

2. Ouvrez la commande cmd de Windows (bien sûr, vous pouvez également utiliser la console Terminal fournie avec Android Studio), et basculez vers le chemin de la classe d'interface de méthode native Demo.java. Utilisez ensuite javac Demo.javapour convertir la classe en fichier .class. Remarque: n'incluez pas de commentaires chinois dans Demo.java.

3. Revenez ensuite au répertoire java du projet et utilisez le javah -classpath . -jni + 包名 + 文件名fichier .h généré (le point avant -jni dans la commande est nécessaire). Utilisez la commande cd ... pour changer le répertoire de niveau supérieur de Windows.

4. Une fois l'exécution terminée, vous pouvez voir un fichier .h avec le nom du package + le nom du fichier dans le répertoire java, et le code du nom de la fonction jni correspondant à Demo.java y est écrit.

/ * NE PAS MODIFIER CE FICHIER - il est généré par la machine * /
#include <jni.h>
/ * En-tête de la classe com_wasu_myjni_jni_Demo * /

#ifndef _Included_com_wasu_myjni_jni_Demo
#define _Included_com_wasu_myjni_jni_Demo
#ifdef __cplusplus
extern "C" {
#fin si
/ *
 * Classe: com_wasu_myjni_jni_Demo
 * Méthode: somme
 * Signature: (II) I
 * /
JNIEXPORT jint JNICALL Java_com_wasu_myjni_jni_Demo_addTwo
  (JNIEnv *, jobject, jit, jit);

/ *
 * Classe: com_wasu_myjni_jni_Demo
 * Méthode: twoSum
 * Signature: ([II) I
 * /
JNIEXPORT jint JNICALL Java_com_wasu_myjni_jni_Demo_addPlus
  (JNIEnv *, jobject, jintArray, jint);

#ifdef __cplusplus
}
#fin si
#fin si

Comme vous pouvez le voir, le nom de la fonction jni correspondant à la méthode dans Demo.java a été écrit dans le fichier

À ce stade, copiez et collez le contenu du fichier .h généré dans le fichier native-lib.cpp que nous avons créé auparavant, et la partie de dénomination du code jni est terminée. Ensuite, implémentez la méthode correspondante dans native-lib.cpp.

Remarque: Android Sudio fournit désormais une implémentation de raccourci. Cliquez sur la méthode qui s'affiche en rouge dans la classe Demo.java et une fonction de création JNI pour addTwo apparaîtra. Cliquez pour créer la méthode C ++ correspondante dans native-lib.cpp pour obtenir une fonction spécifique .


Après avoir écrit le nom de la fonction jni, vous constaterez que le code de Demo.java n'est plus rouge, indiquant que la méthode de Demo.java peut appeler la fonction jni correctement. Chargez native-lib dans MainActivity et appelez la méthode dans Demo à des endroits spécifiques.

// Utilisé pour charger la bibliothèque 'native-lib' au démarrage de l'application.
statique {
    System.loadLibrary ("native-lib");
}
@Passer outre
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.activity_main);

    // Exemple d'appel à une méthode native
    TextView tv = findViewById (R.id.sample_text);
    tv.setText ("a + b =" + new Demo (). addTwo (2, 3)); // Appel
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Je suppose que tu aimes

Origine blog.csdn.net/MYBOYER/article/details/106115830
conseillé
Classement