Native Development<br />Android<br />
Для чего?<br />Игры, в которых много графики<br />Ресурсоемкие алгоритмы обработки<br />image/audio processing<br />Подклю...
Подготовка<br />Скачать Android NDK (Revision 5b Jan 10)<br />При распаковке zip избегайте путей с пробелами. (всегда и ве...
NDK<br />ndk-build скрипт в корне<br />lib и include – либыи h-ники, которые можно подключить<br />samples – примеры<br />...
Native project<br />Находится в папке jni в корне Android-проекта<br />Содержит android.mk — make-файлы для ndk-build<br />
Root Android.mk<br />include$(call all-subdir-makefiles)<br />
Single project’s Android.mk<br />	LOCAL_PATH := $(call my-dir)<br />	include$(CLEAR_VARS)<br />	LOCAL_ARM_MODE := arm<br /...
Связка с Java-кодом (JNI)<br />Хороший стиль — хранить нативные вызовы в отдельном классе<br />publicclassAudioCoreJNI {<b...
Связка с Java-кодом (JNI)<br />#include<jni.h><br />JNIEXPORT<br />jbooleaninitialize(JNIEnv* env, jobjectthiz, jintArray...
OnLoad()<br />JNINativeMethod methods[] = {<br />{"nativeInitialize", "([I)Z", (bool*)initialize },<br />{"nativeEncode", ...
Native logging<br />#include<android/log.h><br />#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, “LOG_TAG", __VA_...
Compiling<br />
Compiling<br />
Running Android project<br />
Fixing, Compiling, Running<br />
Reading crash logs<br />http://code.google.com/p/android-ndk-stacktrace-analyzer/<br />logcat from your android device, co...
Спасибо за внимание<br />Презентацию подготовил <br />Шауберт Александрshaubert.alexander@gmail.com<br />Специально для An...
of 17

Native Development

Presentation dedicated to native development of android applications.
Published on: Mar 3, 2016
Source: www.slideshare.net


Transcripts - Native Development

  • 1. Native Development<br />Android<br />
  • 2. Для чего?<br />Игры, в которых много графики<br />Ресурсоемкие алгоритмы обработки<br />image/audio processing<br />Подключение библиотек на C/C++<br />FAAC, LAME, FFMPEG…<br />Выйти за пределы кучи в Java (≈24MB)<br />android.os.Debug.getNativeHeapAllocatedSize()<br />
  • 3. Подготовка<br />Скачать Android NDK (Revision 5b Jan 10)<br />При распаковке zip избегайте путей с пробелами. (всегда и везде избегайте путей с пробелами)<br />Добавить в PATH путь к распакованному NDK<br />Cygwin for Win (with gcc/make/smth else)<br />gcc/make/smthelsefor *nix<br />
  • 4. NDK<br />ndk-build скрипт в корне<br />lib и include – либыи h-ники, которые можно подключить<br />samples – примеры<br />docs - хелп<br />
  • 5. Native project<br />Находится в папке jni в корне Android-проекта<br />Содержит android.mk — make-файлы для ndk-build<br />
  • 6. Root Android.mk<br />include$(call all-subdir-makefiles)<br />
  • 7. Single project’s Android.mk<br /> LOCAL_PATH := $(call my-dir)<br /> include$(CLEAR_VARS)<br /> LOCAL_ARM_MODE := arm<br /> LOCAL_CFLAGS := $(LOCAL_CFLAGS) -O3<br /> LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS) -O3<br /> LOCAL_MODULE := core<br /> LOCAL_SRC_FILES := AacEncoder.cpp <br /> AudioEncodingController.cpp <br /> AudioEncodingJni.cpp <br /> EncoderConfiguration.cpp <br /> LameEncoder.cpp<br /> LOCAL_LDLIBS := -ldl -llog -lc<br /> LOCAL_STATIC_LIBRARIES := faac lame <br /> LOCAL_C_INCLUDES := $(LOCAL_PATH)/../faac-1.28/include/ <br />$(LOCAL_PATH)/../lame-3.98.4/include/ <br />$(LOCAL_PATH)/../libogg-1.2.2/include/ogg/<br /> include$(BUILD_SHARED_LIBRARY)<br />required<br />optimization<br />required<br />dependencies<br />good style<br />required<br />
  • 8. Связка с Java-кодом (JNI)<br />Хороший стиль — хранить нативные вызовы в отдельном классе<br />publicclassAudioCoreJNI {<br />static { <br />System.loadLibrary("core");<br />Log.d(AudioCoreJNI.class.getSimpleName(), "library loaded");<br />}<br /> ...<br />privatenativevoidnativeSetLogging(boolean on);<br />privatenativebooleannativeInitialize(int[] configuration);<br />privatenativeintnativeGetOutputBufferSize(intsamplesCount);<br /> privatenativebyte[] nativeFlush();<br />privatenativevoidnativeClose();<br />}<br />
  • 9. Связка с Java-кодом (JNI)<br />#include<jni.h><br />JNIEXPORT<br />jbooleaninitialize(JNIEnv* env, jobjectthiz, jintArray configuration) {<br />voidJava_com_example_nativeaudio_NativeAudio_createEngine (JNIEnv* env, jclassclazz){<br />
  • 10. OnLoad()<br />JNINativeMethod methods[] = {<br />{"nativeInitialize", "([I)Z", (bool*)initialize },<br />{"nativeEncode", "([BII[B)I", (void*)encode}};<br />intjniRegisterNativeMethods(JNIEnv* env, constchar* className, constJNINativeMethod* gMethods, intnumMethods) {<br />jclassclazz;<br />clazz = env->FindClass("com/shaubert/android/aaf/jni/AudioCoreJNI");<br />if (clazz != NULL) {<br /> if (env->RegisterNatives(clazz, gMethods, 2) >= 0) {<br /> return 0;<br /> }<br /> } <br />return -1;<br />}<br />jintJNI_OnLoad(JavaVM* vm, void* reserved) {<br />JNIEnv* env = NULL;<br />if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK) {<br /> if (jniRegisterNativeMethods(env, classPathName, methods, 2) > 0) {<br /> return JNI_VERSION_1_4;<br /> }<br /> }<br />return -1;<br />}<br />
  • 11. Native logging<br />#include<android/log.h><br />#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, “LOG_TAG", __VA_ARGS__)<br />if (logging) {<br /> LOGD(“test logging %s %d...“, “hello”);<br />}<br />
  • 12. Compiling<br />
  • 13. Compiling<br />
  • 14. Running Android project<br />
  • 15. Fixing, Compiling, Running<br />
  • 16. Reading crash logs<br />http://code.google.com/p/android-ndk-stacktrace-analyzer/<br />logcat from your android device, containing a stacktrace<br />asm file of the library being debugged. You generate this file by using the NDK's objdumptool:<br /> ...android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/…/<br /> arm-eabi-objdump-S mylib.so >mylib.asm<br />Use the script by running:<br /> python parse_stack.py <asm-file> <logcat-file><br />Output:<br />
  • 17. Спасибо за внимание<br />Презентацию подготовил <br />Шауберт Александрshaubert.alexander@gmail.com<br />Специально для Android May Days 2011<br />

Related Documents