Android admite lenguajes C ++ (NDK) y Java (SDK). Al usar el lenguaje C ++, es particularmente importante interactuar con el código C ++ y Java. Hay un ejemplo simple para muestras/hello-jni para referirse en el paquete NDK descargado.
Java llama a C ++
Cree un nuevo proyecto de Android y cree la siguiente clase:
paquete com.example.testjni; public class TextJni {// Soporte a C Static {System.LoadLibrary ("Jniinterface"); } public static national int getInt (); Cadena nativa estática pública getString ();}Lo anterior declara dos métodos nativos, lo que indica que la implementación del método de GetInt y GetTring se administrará en C ++ (libjniinterface.so).
Ejecute el siguiente comando en el directorio de clases para generar el archivo de implementación correspondiente al nativo.
javah com.example.testjni.TextJni # Note that if you want to have an Android SDK class, you need to specify a classpath, such as javah -classpath /Users/Richard/dev/android/sdk/platforms/android-19/android.jar:./bin/classes com.togic.gameengine.GFRenderer
Genere el archivo de encabezado y copie, cree la carpeta JNI y cree el archivo de implementación de 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étodos para implementar com_example_textjni_textjni.h jniexport jint jnicall java_com_example_testjni_textjni_getint (jnienv * env, jclass cls) {return sum ();} jniexport jnicall Java_com_example_testjni_textjni_getstring (jnienv * env, jclass cls) {return env-> newStringutf ("hellondk!");}Aquí se usa la compilación cruzada, y se requiere Android.mk para organizar el código C ++.
Cree un nuevo archivo Android.mk en JNI/
Android.mk:local_path: = $ (call my-dir) Incluya $ (clear_vars) local_module: = jniinterfacElocal_src_files: = com_example_testjni_textjni.cpp#local_c_includes: = $ (local_path) Incluya $ (build_shared_librarrar)
Luego puede usar la herramienta en el NDK: NDK-Build para generar la biblioteca de enlaces dinámicos: libjniinterface.so
El archivo de biblioteca generado puede llamarse por el archivo Java anterior.
C ++ llame a Java
Puede usar JNI para llamar a Java en el método GetString en el ejemplo anterior:
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"); instttextjni = jnienv-> newobject (textjni, construction_id); getCurrint = jnienv-> getStaticMethodid (textjni, "getCurrint", "() i"); // llame al método estático Java jint jiref = jnienv-> callstaticintMethod (textjni, getCurrint); // limpiar jnienv-> deletElocalRef (textJni); Jnienv-> DeletElocalRef (InstTextJni); std :: string strref = "Hellondk!" + ver-> getStaticstring (); return env-> newStringutf (strref.c_str ());}En primer lugar, vale la pena señalar que las funciones en JNI.H distinguen entre los lenguajes C y C ++. Para C ++, lo siguiente es generalmente el siguiente:
jclass clazz = env-> findclass (className);
Y para C:
jclass clazz = (*env)-> findclass (env, className);
El tercer parámetro en getMethodid representa la firma del método, que se puede obtener de la siguiente manera:
Nombre del paquete Javap -S. El nombre de la clase obtiene la firma del método
Conversión de tipo de datos JNI adjunta
Jstring a Char *
const char nativestring = (env)-> getStringutfars (env, javastring, 0);
Devuelve un puntero a una matriz de caracteres UTF-8 de la cadena que permanecerá válida hasta que sea lanzado por ReleSeStringutFars ().
(*env)-> releSestringutfars (env, javastring, nativestring);
Char * a Jstring
jString JSTR = (Env)-> NewStringutf (env, Char Utf)
Use la matriz de caracteres UTF-8 para construir un nuevo objeto java.lang.string.
Otros tipos Seleccione todas las copias en notas Java Tipo Local C Tipo Descripción
boolean jboolean unsigned, 8 bits
byte jbyte unsigned, 8 bits
Char Jchar Unsigned, 16 bits
Jshort corta firmado, 16 bits
int jint firmado, 32 bits
Long Jlong firmado, 64 bits
flotante jfloat 32 bits
Doble JDouble 64 bits
vacío n/a