Android unterstützt C ++ (NDK) und Java (SDK) Sprachen. Bei Verwendung der C ++ - Sprache ist es besonders wichtig, mit C ++ Code und Java zu interagieren. Es gibt ein einfaches Beispiel für Muster/Hallo-Jni, auf das Sie sich im heruntergeladenen NDK-Paket beziehen können.
Java ruft C ++ an
Erstellen Sie ein neues Android -Projekt und erstellen Sie die folgende Klasse:
paket com.example.testjni; public class textjni {// Unterstützung für C static {System.loadlibrary ("JniInterface"); } public static native int getInt (); öffentliche statische native String Getstring ();}Die oben genannten nativen Methoden deklariert zwei native Methoden, was darauf hinweist, dass die Methodeimplementierung von GetInt und GetString in C ++ (libjniinterface.so) angegeben wird.
Führen Sie den folgenden Befehl im Verzeichnis der Klassen aus, um die Implementierungsdatei zu generieren, die native entspricht.
javah com.example.testjni.textjni # Beachten Sie, dass Sie, wenn Sie eine Android -SDK -Klasse haben möchten, einen Klassenpfad angeben müssen, wie Javah -classpat /users/Richard/dev/android/sdk/platforms/android-19/android.jar:./Bin/bin/bin/bin/casses com.togic.gnendine./Bin/bin/bin/bin/bin/casses com.togic.gfrender./bin/bin/bin/bin/casses com.togic.togic.
Generieren Sie die Header -Datei und kopieren Sie sie, erstellen Sie den JNI -Ordner und erstellen Sie die CPP -Implementierungsdatei
com_example_testjni_textjni.cpp: #include <stdio.h> #include <stdlib.h> #include "com_example_testjni_textjni.h" int summe () {int x, y; x = 100; y = 1000; x += y; return x;} // Methoden zum Implementieren von com_example_textjni_textjni.h jniexport jint jnicall java_com_example_testjni_textjni_getint (jnienv * env, jclass cls) {return Java_com_example_testjni_textjni_getString (jnienv * env, jclass cls) {return env-> newStringutf ("Hellondk!");}Hier wird eine Kreuzkompilierung verwendet, und Android.mk ist erforderlich, um C ++-Code zu organisieren.
Erstellen Sie eine neue Android.mk -Datei unter jni/
Android.mk:Local_path: = $ (call my-dir) inklusive $ (clear_vars) local_module: = jniinterfacelocal_src_files: = com_example_testjni_textjni.cpp#local_c_includes: = $ (local_path) include $ $ (build_shared_libry))
Dann können Sie das Tool im NDK: NDK-Build verwenden, um eine dynamische Linkbibliothek zu generieren: libjniinterface.so
Die generierte Bibliotheksdatei kann von der vorherigen Java -Datei aufgerufen werden.
C ++ rufen Sie Java an
Sie können JNI verwenden, um Java in der GetString -Methode im obigen Beispiel aufzurufen:
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-> getstaticMethodid (textjni, "getCurrint", "() i"); // Java statische Methode nennen jint jInf = jnienv-> callStaticintMethod (textjni, getCurrint); // Jnienv-> DeletElocalRef (textJni) reinigen; jnienv-> deletElocalRef (Insttextjni); std :: string strref = "hellondk!" + view-> getStaticString (); return env-> newStingUtf (strref.c_str ());}Zunächst ist es erwähnenswert, dass die Funktionen in jni.h zwischen C- und C ++ - Sprachen unterscheiden. Für C ++ ist Folgendes im Allgemeinen wie folgt:
JCLASS CLAZZ = ENV-> FINDCLASS (Klassenname);
Und für c:
JClass clazz = (*env)-> findClass (env, className);
Der dritte Parameter in getMethodid repräsentiert die Methodensignatur, die wie folgt erhalten werden kann:
Javap -S -Paketname. Der Klassenname erhält die Signatur der Methode
Angehängte JNI -Datentypkonvertierung beigefügt
jString zu char *
const char nativestring = (env)-> getstringutfchars (env, javastring, 0);
Gibt einen Zeiger auf ein UTF-8-Zeichen-Array der Zeichenfolge zurück, das bis zum Veröffentlichung von ReleasStringutfchars () gültig bleibt.
(*env)-> releasestringutfchars (env, javastring, nativestring);
char * zu jstring
Jstring Jstr = (Env)-> NewStringUtf (Env, char utf)
Verwenden Sie das UTF-8-Zeichen-Array, um ein neues java.lang.String-Objekt zu erstellen.
Andere Typen Wählen Sie alle Kopieren in Notizen Java Typ Lokal C Typ -Typ Beschreibung
Boolean Jboolean Unsigned, 8 Bit
Byte JByte nicht signiert, 8 Bit
char jchar nicht signiert, 16 Bit
Kurze Jshort signiert, 16 Bit
Int Jint signiert, 32 Bit
langer jlong unterschrieben, 64 Bit
schweben Sie Jfloat 32 Bit
Doppelte JDouble 64 Bit
void void n/a