android 应用开发专题 2 jni 与 ndk 开发

Click here to load reader

Upload: zareh

Post on 29-Jan-2016

235 views

Category:

Documents


0 download

DESCRIPTION

ANDROID 应用开发专题 2 JNI 与 NDK 开发. 刘健培 北京邮电大学 [email protected] 2013.05. 本次内容. Android 应用程序专题 之 NDK NDK 概念 NDK 开发 流程 JNI 原理 NDK 应用 示例. 参考资料. http://developer.android.com/tools/sdk/ndk/index.html http://groups.google.com/group/android-ndk NDK 安装目录 Docs/ 下的文档 Samples/ 下的示例 代码 JNI 接口规范 - PowerPoint PPT Presentation

TRANSCRIPT

ANDROID

[email protected] JNINDKAndroidNDKNDKNDKJNINDKhttp://developer.android.com/tools/sdk/ndk/index.htmlhttp://groups.google.com/group/android-ndkNDKDocs/Samples/JNIhttp://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/jniTOC.html

NDKhttp://developer.android.com/tools/sdk/ndk/index.htmlNative Development Kit GoogleAndroidC/C++mkCPUABI.mk.soAPKAPIAPIlibc (C library) headerslibm (math library) headersJNI interface headerslibz (Zlib compression) headersliblog (Android logging) headerA Minimal set of headers for C++ supportOpenSL ES native audio librariesAndroid native application APISOpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics librariesNDK r3) headerslibjnigraphics (Pixel buffer access) header (for Android 2.2 and above NDK r4).APINDKdocs/ STABLE-APIS.htmlNDK/Android/SDKso(C/C++)SDKdex(Java)arsc XMLNDKJNIApkNDKNDK AndroidC/C++Android SDKJava-Dalvik-jni-C/C++sosoapkAndroidNDKCAndroid it is not a good way!UINative ActivityNDKC/C++C/C++JNIJavaJavadexsoAndroidJavaC/C++JavaNDKAndroid1.5

NDKNDKJNI Java C/C++NativeActivity(C/C++)C/C++Android NDKAndroid SDKAndroid SDK(NDKapk)Android 1.5 SDKWindows XP (32-bit) or Vista (32- or 64-bit)Mac OS X 10.4.8 or later (x86 only)Linux (32 or 64-bit; Ubuntu 8.04, or other Linux distributions using GLibc 2.7 or later)GNU Make 3.81(NDK r8e)awk (GNU Awk Nawk) (NDK r8e)Cygwin 1.7 (Windows)(http://www.cygwin.com/)WindowsAndroid NDKhttp://developer.android.com/tools/sdk/ndk/index.html)cygwin(http://cygwin.com/setup.exe) Android NDKNDKwindowsPathCygwinAndroid NDKEclipseNDK

NDKvs-androidhttp://code.google.com/p/vs-android/VisualGDBhttp://visualgdb.com/?features=android

NDK

DocsSamplesPlatformNDK+SourcesSTLndk-buildToolchainsBuildPrebuiltWakmakeSondk-stackTestsNDKJavaAPKndk-gdbgdbSDKNDKdocumentation.html NDK

NDKbitmap-plasma - NDKbitmapNDKbitmapbitmaphello-gl2 - NDKOpenGLEShello-jni - NDKNDKAndroidhello-neon - NDKneonmodule-exports - foobarfoozoobarnative-activity - NDKAndroidnative-audio - NDKnative-media - NDKnative-plasma - NDKAndroidplasmasan-angeles - AndroidOpenGL EStest-libstdc++ - C++C++two-libs - firstsecondsecondfirst

NDKNDKsoSDKAPKAndroid.mk#Android.mk LOCAL_PATH , 'my-dir'LOCAL_PATH := $(call my-dir)#CLEAR_VARS GNU makefile LOCAL_PATHLOCAL_XXXinclude $(CLEAR_VARS)#LOCAL_MODULE Android.mk'libhello-jni.so'LOCAL_MODULE := hello-jni#LOCAL_SRC_FILES C C++LOCAL_SRC_FILES := hello-jni.c#BUILD_SHARED_LIBRARY'include $(CLEAR_VARS)'LOCAL_XXX BUILD_STATIC_LIBRARYinclude $(BUILD_SHARED_LIBRARY)

2APIABI2SocketRPCWeb ServiceCOMCOBRA.NETCLS -> -> -> ->

JNIJNIJavaNativeInterface Java(VM)JavaCC++JNIJavaNativeNativeJavaJavaNativeJNIAndroid FrameworkJNIJavaC/C++AndroidJNI2NDKAndroidJava -> C/C++JavaJavaNativenative void funcName()static {System.loadLibrary(libName)}JavaNativejavac fileName.javaCjavahJNI NativeJavah -jni javah className -> className.hJava__JNIEXPORT jint JNICALL Java_class_method(JNIEnv *env, jobject obj);C/C++JNINativeJNIEXPORT jint JNICALL Java_class_method(JNIEnv *env, jobject obj){}C/C++JavaJNINativeJava- C/C++2Java- C/C++com.android.xxx packageclass.javamethodjavah -jni om.android.xxx.testcom_android_xxx_class.hjava_com_android_xxx_class_methodJavaSystem.loadLibrary()NativeC/C++JavaJava NativeJNI NativeJNI Native

Java- C/C++()JNI NativeJava NativeNativeJavaSystem.loadLibrary()JavaJNI_OnLoadJNI_OnLoadJNI_OnLoadRegisterNatives()JavaC/C++ -> Java2JNI NativeJavaJNIJNICJavaInvocation APIJNINative JNI Java JNI (JNIEnv*)

JNIJavaJavaJava

JNIEXPORT void JNICALL Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth){ jclass cls = (*env)->GetObjectClass(env, obj); jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V"); if (mid != 0) (*env)->CallVoidMethod(env, obj, mid, depth);}

Invocation APIJNIInvocation APINativeJavaJava Java Java C/C++JAVA JAVA JAVA classJAVA JNI Invocation API JNI

#include /* */

...

JavaVM *jvm; /* Java */JNIEnv *env; /* */JDK1_1InitArgs vm_args; /* JDK 1.1 */

vm_args.version = 0x00010001; /* 1.1.2 *//* */JNI_GetDefaultJavaVMInitArgs(&vm_args);vm_args.classpath = ...;

/* Java env JNI */JNI_CreateJavaVM(&jvm, &env, &vm_args);

/* JNI Main.test */jclass cls = env->FindClass("Main");jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");env->CallStaticVoidMethod(cls, mid, 100);

/* */jvm->DestroyJavaVM();NDKEclipse+CDT+gdbCygwin+ant+adb__android_log_print

#include int __android_log_print(int prio, const char *tag, const char *fmt, ...)LOCAL_LDLIBS := -llog

Native ActivityNative ActivityAndroid 2.3JavaAndroid.appNativeActivityactivityAndroidManifest.xmlNDKAPINative ActivityAPI\platforms\android-xx\arch-arm\usr\include\android\sources\android\native_app_glue\Native ActivityNative Activityandroid_main()androidndk\samples\2Native Activitynative-activityOpenGLESnative-plasmaNDK vs. RenderScriptAndroidAndroidNDKRenderScriptRenderscript(RS)Android3.03DAPIC99NDKC/C++RenderScriptC99 RenderScriptCAndroidNDK(Google TV) NDKNDKgdbRenderScript RenderScriptNDKRenderScriptRenderScriptNDKNDKOpenGL(SDK)