Android поддерживает языки C ++ (NDK) и Java (SDK). При использовании языка C ++ особенно важно взаимодействовать с кодом C ++ и Java. Есть простой пример для образцов/hello-jni для обозначения в загруженном пакете NDK.
Java вызывает C ++
Создайте новый проект Android и создайте следующий класс:
пакет com.example.testjni; public class textjni {// Поддержка в c static {System.loadlibrary ("jniInterface"); } public static native int getInt (); Общественная статическая нативная строка getString ();}Вышеуказанное объявляет два нативных метода, указывающие, что метод реализации GetInt и GetString будет предоставлена в C ++ (libjniInterface.so).
Запустите следующую команду в каталоге классов, чтобы сгенерировать файл реализации, соответствующий собственному.
javah com.example.testjni.textjni # Обратите внимание, что если вы хотите провести класс Android SDK, вам нужно указать группу класса, например Javah-classpath/Ousers/richard/dev/android/sdk/platforms/android-19/android.jar:./bin/classes com.tog.gamenerengin.
Создайте файл заголовка и скопируйте его, создайте папку JNI и создайте файл реализации 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; вернуть x;} // методы для реализации 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!");}Здесь используется межкомпиляция, и Android.mk требуется для организации кода C ++.
Создайте новый файл Android.mk под JNI/
Android.mk:local_path: = $ (call my-dir) include $ (clear_vars) local_module: = jniinterfacelocal_src_files: = com_example_testjni_textjni.cpp#local_c_includes: = $ (local_path) incule $ (build_shred_library).
Затем вы можете использовать инструмент в NDK: NDK-Build для генерации библиотеки динамических ссылок: libjniinterface.so
Сгенерированный файл библиотеки может быть вызван предыдущим файлом Java.
C ++ Позвоните на Java
Вы можете использовать JNI, чтобы вызвать Java в методе GetString в приведенном выше примере:
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"); instextJni = jnienv-> newObject (textJni, construction_id); getCurrint = jnienv-> getStaticMethodid (textJni, "getCurrint", "() i"); // вызов Java Static Method Jint Jiref = jnienv-> callstaticintmethod (textjni, getCurrint); // чистить jnienv-> deletelocalref (textjni); jnienv-> deletelocalref (instextjni); std :: string strref = "hellondk!" + view-> getStaticString (); return env-> newstringutf (strref.c_str ());}Прежде всего, стоит отметить, что функции в JNI.H различают языки C и C ++. Для C ++ следующее в целом следующим образом:
jclass clazz = env-> findclass (classname);
И для C:
jclass clazz = (*env)-> findclass (env, classname);
Третий параметр в getMethodid представляет подпись метода, которая может быть получена следующим образом:
javap -s name. Имя класса получает подпись метода
Прилагаемое преобразование типа данных JNI
JString to char *
const char nativestring = (env)-> getStringutfchars (env, javastring, 0);
Возвращает указатель на массив символов UTF-8 строки, которая останется действительной до тех пор, пока она не будет выпущена ReleaseStringUtfchars ().
(*env)-> releasestringutfchars (env, javastring, nativestring);
Чар *
jstring jstr = (env)-> newstringutf (env, char utf)
Используйте массив символов UTF-8, чтобы построить новый объект java.lang.string.
Другие типы выберите все копирование в заметки тип Java Local C Type Описание
логический jboolean unsigned, 8 битов
байт jbyte unsigned, 8 битов
Чар Джач не знал, 16 битов
Short JShort подписано, 16 бит
Int Jint подписан, 32 бита
Long Jlong подписан, 64 бита
Float Jfloat 32 бита
двойной jdouble 64 бита
void void n/a