Android prend en charge les langues C ++ (NDK) et Java (SDK). Lorsque vous utilisez la langue C ++, il est particulièrement important d'interagir avec le code C ++ et Java. Il y a un exemple simple pour les échantillons / Hello-jni à référence dans le package NDK téléchargé.
Java appelle C ++
Créez un nouveau projet Android et créez la classe suivante:
package com.example.testjni; classe publique textjni {// Prise en charge de C static {System.LoadLibrary ("JniInterface"); } public static natif int getInt (); String natif statique publique getString ();}Ce qui précède déclare deux méthodes natives, indiquant que la mise en œuvre de la méthode de GetInt et GetString sera donnée en C ++ (libjniInterface.so).
Exécutez la commande suivante dans le répertoire des classes pour générer le fichier d'implémentation correspondant à Native.
javah com.example.testjni.textjni # Notez que si vous voulez avoir une classe SDK Android, vous devez spécifier un ClassPath, comme Javah -Classpath /Users/richard/dev/android/sdk/platforms/android-19/android.gfrender
Générez le fichier d'en-tête et copiez-le, créez le dossier JNI et créez le fichier d'implémentation CPP
com_example_testjni_textjni.cpp: #include <stdio.h> #include <stdlib.h> #include "com_example_testjni_textjni.h" int sum () {int x, y; x = 100; y = 1000; x + = y; return x;} // Méthodes pour implémenter com_example_textjni_textjni.h jniexport jint jnicall java_com_example_testjni_textjni_getInt (jNienv * env, jclass cls) {return sum ();} jniexport jString Jnicall Java_com_example_testjni_textjni_getString (jnienv * env, jclass cls) {return env-> NewstringUtf ("Hellondk!");}La compilation croisée est utilisée ici et Android.mk est nécessaire pour organiser le code C ++.
Créez un nouveau fichier Android.mk sous JNI /
Android.mk:Local_path: = $ (appel my-di) inclut $ (clear_vars) local_module: = jniinterfacelocal_src_files: = com_example_testjni_textjni.cpp # local_c_includes: = $ (local_path) inclut $ (build_shared_library)
Ensuite, vous pouvez utiliser l'outil dans le NDK: NDK-Build pour générer une bibliothèque de liens dynamiques: libjniInterface.so
Le fichier de bibliothèque généré peut être appelé par le fichier Java précédent.
C ++ Appeler Java
Vous pouvez utiliser JNI pour appeler Java dans la méthode getString dans l'exemple ci-dessus:
Jniexport jstring jnicall java_com_togic_testjni2_textjni_getString (jNienv * env, jclass cls) {jclass textjni; Jobject InstTextJni; jMethodid getcurrint; JNienv * jnienv = env; Textjni = jnienv-> findClass ("com / togic / testjni2 / textjni"); JMetHoDID CONSTRUCTION_ID = JNIENV-> GetMethoDID (TextJni, "init", "() v"); InstTextJni = JNienv-> NewObject (TextJni, Construction_ID); getCurrint = jNienv-> getStatingMethodid (textjni, "getCurrint", "() i"); // Appel Java Static Method Jint Jiref = JNienv-> CallStaticIntMethod (TextJni, GetCurrint); // Clean JNienv-> DeleteLocalref (TextJni); JNienv-> DeleteLocalRef (InstTextJni); std :: string strref = "Hellondk!" + View-> getStaticString (); return Env-> NewstringUtf (strref.c_str ());}Tout d'abord, il convient de noter que les fonctions de Jni.h distinguent les langues C et C ++. Pour C ++, ce qui suit est généralement le suivant:
JClass Clazz = Env-> findClass (className);
Et pour C:
JClass Clazz = (* Env) -> findClass (Env, className);
Le troisième paramètre de GetMethodid représente la signature de la méthode, qui peut être obtenue comme suit:
Nom du package Javap -S. Le nom de classe obtient la signature de la méthode
Conversion de type de données JNI attaché
jstring à char *
const char nativestring = (env) -> getStringUtfchars (env, javastring, 0);
Renvoie un pointeur vers un tableau de caractères UTF-8 de la chaîne qui restera valide jusqu'à ce qu'il soit libéré par releasesringUtfchars ().
(* Env) -> releasesringutfchars (env, javastring, nativestring);
char * à jstring
JString JStr = (Env) -> NewstringUtf (Env, Char UTF)
Utilisez un tableau de caractères UTF-8 pour construire un nouvel objet java.lang.string.
Autres types Sélectionnez toutes les copions dans les notes Java Type local C Type Description
booléen jboolean unsigned, 8 bits
octet jbyte non signé, 8 bits
Char Jchar Unsigned, 16 bits
Short Jshort signé, 16 bits
Int Jint signé, 32 bits
Long Jlong signé, 64 bits
float jfloat 32 bits
double jdouble 64 bits
vide vide n / a