O Android suporta idiomas C ++ (NDK) e Java (SDK). Ao usar o idioma C ++, é particularmente importante interagir com o código C ++ e Java. Há um exemplo simples para amostras/hello-jni se referirem no pacote NDK baixado.
Java chama C ++
Crie um novo projeto Android e crie a seguinte classe:
pacote com.example.testjni; classe pública textjni {// suporta a c static {System.loadlibrary ("jniInterface"); } public static nativo int getint (); public estático nativo string getString ();}O acima declara dois métodos nativos, indicando que a implementação do método de getint e getstring será fornecida em C ++ (libjniinterface.so).
Execute o seguinte comando no diretório de classes para gerar o arquivo de implementação correspondente ao 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
Gere o arquivo de cabeçalho e copie -o, crie a pasta JNI e crie o arquivo de implementação do 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; retornar x;} // métodos para implementar com_example_textjni_textjni.h jniexport jint jnicall java_com_example_testjni_textjni_getInt (jnienv * Env, jclass cls) {retornar sum ();} jniexport jnnnic jnnic, Java_com_example_testjni_textjni_getstring (jnienv * Env, jclass cls) {return Env-> Newstringutf ("Hellondk!");}A compilação cruzada é usada aqui e o Android.MK é necessário para organizar o código C ++.
Crie um novo arquivo Android.mk em JNI/
Android.mk:local_path: = $ (ligue para o meu-Dir)
Então você pode usar a ferramenta no ndk: ndk-build para gerar biblioteca de link dinâmica: libjniinterface.so
O arquivo de biblioteca gerado pode ser chamado pelo arquivo Java anterior.
C ++ Ligue para Java
Você pode usar o JNI para ligar para Java no método GetString no exemplo acima:
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, construção_id); getCurrint = jnienv-> getstaticmethodid (textjni, "getCurrint", "() i"); // Ligue para o método estático java jint jiref = jnienv-> calstaticIntMethod (textjni, getCurrint); // limpo jnienv-> DeLetelocalRef (textjni); Jnienv-> DeLetelocalRef (InstTextjni); std :: string strref = "hellondk!" + view-> getStaticstring (); Retornar Env-> Newstringutf (strref.c_str ());}Primeiro de tudo, vale a pena notar que as funções no JNI.H distinguem entre os idiomas C e C ++. Para C ++, o seguinte é geralmente o seguinte:
jclass clazz = Env-> findClass (ClassName);
E para C:
jclass clazz = (*Env)-> findClass (Env, ClassName);
O terceiro parâmetro no getMethodid representa a assinatura do método, que pode ser obtida da seguinte forma:
Nome do pacote javap -s. O nome da classe recebe a assinatura do método
Conversão de tipo de dados JNI anexada
JString para char *
const char nativestring = (Env)-> getStringUtfchars (Env, Javatring, 0);
Retorna um ponteiro para uma matriz de caracteres UTF-8 da string que permanecerá válida até que seja lançada pelo RELEASESTRINGUTFCHARS ().
(*Env)-> ReleasEstringutfchars (Env, Javastring, Nativestring);
char * para JString
Jstring jstr = (Env)-> Newstringutf (Env, Char Utf)
Use a matriz de caracteres UTF-8 para construir um novo objeto java.lang.string.
Outros tipos Selecione toda a cópia em notas Java tipo C Local Type Descrição
booleano jbooliano não assinado, 8 bits
byte jbyte não assinado, 8 bits
Char Jchar não assinado, 16 bits
curto jshort assinado, 16 bits
int jint assinado, 32 bits
Long Jlong assinou, 64 bits
Float jfloat 32 bits
Double JDouble 64 bits
vazio vazio n/a