Android NDK开发——CSDN上的博文教程

Android NDK开发——CSDN上的博文教程
Android NDK开发——CSDN上的博文教程

Android的NDK开发(1)————Android JNI简介与调用流程

1、JNI简介

JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。

2、JNI与NDK

简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用。而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。

当然了,你也可以自己搭建交叉编译环境,而不用NDK的工具和库。然后生成库,只要规范操作,一样可以生成能让JAVA层成功调用的库文件的。

利用NDK进行编译本地语言可以参考这篇博文:

https://www.360docs.net/doc/a714819419.html,/conowen/article/details/7522667

3、JNI 调用流程

众所周知,Android的应用层的类都是以Java写的,这些Java类编译为Dex文件之后,必须靠Dalvik 虚拟机( Virtual Machine)来执行。假如在执行java程序时,需要载入C&C++函数时,Dalvik虚拟机就会去加载C&C++的库,(System.loadLibrary("libName");)让java层能顺利地调用这些本地函数。需要清楚一点,这些C&C++的函数并不是在Dalvik虚拟机中运行的,所以效率和速度要比在Dalvik虚拟机中运行得快很多。

Dalvik虚拟机成功加载库之后,就会自动地寻找库里面的JNI_OnLoad函数,这个函数用途如下:(1)告诉Dalvik虚拟机此C库使用哪一个JNI版本。如果你的库里面没有写明JNI_OnLoad()函数,VM会默认该库使用最老的JNI 1.1版本。但是新版的JNI做了很多的扩充,也优化了一些内容,如果需要使用

JNI的新版功能,就必须在JNI_OnLoad()函数声明JNI的版本。如

[java]view plaincopy

1.result = JNI_VERSION_1_4;

当没有JNI_OnLoad()函数时,Android调试信息会做出如下提示(No JNI_OnLoad found)

[java]view plaincopy

1.04-2913:53:1

2.184: D/dalvikvm(361): Trying to load lib /data/data/com.conowen.helloworld/l

ib/libHelloWorld.so 0x44edea98

2.04-2913:53:12.204: D/dalvikvm(361): Added shared lib /data/data/com.conowen.helloworld/lib

/libHelloWorld.so 0x44edea98

3.04-2913:53:12.204: D/dalvikvm(361): No JNI_OnLoad found in /data/data/com.conowen.hellowor

ld/lib/libHelloWorld.so 0x44edea98, skipping init

(2)因为Dalvik虚拟机加载C库时,第一件事是调用JNI_OnLoad()函数,所以我们可以在JNI_OnLoad()里面进行一些初始化工作,如注册JNI函数等等。注册本地函数,可以加快java层调用本地函数的效率。另外:与JNI_OnLoad()函数相对应的有JNI_OnUnload()函数,当虚拟机释放该C库时,则会调用JNI_OnUnload()函数来进行善后清除动作。

4、例子(关于jni里面的数据类型转换与常用jni方法下一篇博文介绍)

下面以havlenapetr的FFmpeg工程里面的onLoad.cpp为例详细说一下:

[cpp]view plaincopy

1.//onLoad.cpp文件

2.

3.#define TAG "ffmpeg_onLoad"

4.

5.#include

6.#include

7.#include "jniUtils.h"

8.

9.extern"C" {

10.

11.extern int register_android_media_FFMpegAVRational(JNIEnv *env);

12.

13.#ifdef BUILD_WITH_CONVERTOR

14.extern int register_android_media_FFMpeg(JNIEnv *env);

15.#endif

16.

17.extern int register_android_media_FFMpegAVFormatContext(JNIEnv *env);

18.extern int register_android_media_FFMpegAVInputFormat(JNIEnv *env);

19.

21.

22.extern int register_android_media_FFMpegAVCodecContext(JNIEnv *env);

23.extern int register_android_media_FFMpegUtils(JNIEnv *env);

24.extern int register_android_media_FFMpegAVFrame(JNIEnv *env);

25.

26.#ifdef BUILD_WITH_PLAYER

27.extern int register_android_media_FFMpegPlayerAndroid(JNIEnv *env);

28.#endif

29.

30.static JavaVM *sVm;

31.

32./*

33. * Throw an exception with the specified class and an optional message.

34. */

35.int jniThrowException(JNIEnv* env, const char* className, const char* msg) {

36. jclass exceptionClass = env->FindClass(className);

37.if (exceptionClass == NULL) {

38. __android_log_print(ANDROID_LOG_ERROR,

39. TAG,

40."Unable to find exception class %s",

41. className);

42.return -1;

43. }

44.

45.if (env->ThrowNew(exceptionClass, msg) != JNI_OK) {

46. __android_log_print(ANDROID_LOG_ERROR,

47. TAG,

48."Failed throwing '%s' '%s'",

49. className, msg);

50. }

51.return 0;

52.}

53.

54.JNIEnv* getJNIEnv() {

55. JNIEnv* env = NULL;

56.if (sVm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {

57. __android_log_print(ANDROID_LOG_ERROR,

58. TAG,

59."Failed to obtain JNIEnv");

60.return NULL;

61. }

62.return env;

63.}

65./*

66. * Register native JNI-callable methods.

67. *

68. * "className" looks like "java/lang/String".

69. */

70.int jniRegisterNativeMethods(JNIEnv* env,

71.const char* className,

72.const JNINativeMethod* gMethods,

73.int numMethods)

74./*从com_media_ffmpeg_FFMpegPlayer.cpp文件跳到此,完成最后的注册

75. * 向 Dalvik虚拟机(即AndroidRuntime)登记传过来的参数gMethods[]所含的本地函数

76. */

77.{

78. jclass clazz;

79.

80. __android_log_print(ANDROID_LOG_INFO, TAG, "Registering %s natives\n", className);

81. clazz = env->FindClass(className);

82.if (clazz == NULL) {

83. __android_log_print(ANDROID_LOG_ERROR, TAG, "Native registration unable to find cla

ss '%s'\n", className);

84.return -1;

85. }

86.if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {

87. __android_log_print(ANDROID_LOG_ERROR, TAG, "RegisterNatives failed for '%s'\n", cl

assName);

88.return -1;

89. }

90.return 0;

91.}

92.//Dalvik虚拟机加载C库时,第一件事是调用JNI_OnLoad()函数

93.jint JNI_OnLoad(JavaVM* vm, void* reserved) {

94. JNIEnv* env = NULL;//定义JNI Env

95. jint result = JNI_ERR;

96. sVm = vm;

97./*JavaVM::GetEnv 原型为 jint (*GetEnv)(JavaVM*, void**, jint);

98. * GetEnv()函数返回的 Jni 环境对每个线程来说是不同的,

99. * 由于Dalvik虚拟机通常是Multi-threading的。每一个线程调用JNI_OnLoad()时,

100. * 所用的JNI Env是不同的,因此我们必须在每次进入函数时都要通过vm->GetEnv重新获取

101. *

102. */

103.//得到JNI Env

104.if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {

105. __android_log_print(ANDROID_LOG_ERROR, TAG, "GetEnv failed!");

106.return result;

107. }

108.

109. __android_log_print(ANDROID_LOG_INFO, TAG, "loading . . .");

110.

111./*开始注册

112. * 传入参数是JNI env

113. * 由于下面有很多class,只以register_android_media_FFMpegPlayerAndroid(env)为例子

114. */

115.

116.#ifdef BUILD_WITH_CONVERTOR

117.if(register_android_media_FFMpeg(env) != JNI_OK) {

118. __android_log_print(ANDROID_LOG_ERROR, TAG, "can't load android_media_FFMpeg"); 119.goto end;

120. }

121.#endif

122.

123.if(register_android_media_FFMpegAVFormatContext(env) != JNI_OK) {

124. __android_log_print(ANDROID_LOG_ERROR, TAG, "can't load android_media_FFMpegAVFor matContext");

125.goto end;

126. }

127.

128.if(register_android_media_FFMpegAVCodecContext(env) != JNI_OK) {

129. __android_log_print(ANDROID_LOG_ERROR, TAG, "can't load android_media_FFMpegAVCod ecContext");

130.goto end;

131. }

132.

133.if(register_android_media_FFMpegAVRational(env) != JNI_OK) {

134. __android_log_print(ANDROID_LOG_ERROR, TAG, "can't load android_media_FFMpegAVRat ional");

135.goto end;

136. }

137.

138.if(register_android_media_FFMpegAVInputFormat(env) != JNI_OK) {

139. __android_log_print(ANDROID_LOG_ERROR, TAG, "can't load android_media_FFMpegAVInp utFormat");

140.goto end;

141. }

142.

143.if(register_android_media_FFMpegUtils(env) != JNI_OK) {

144. __android_log_print(ANDROID_LOG_ERROR, TAG, "can't load android_media_FFMpegUtils ");

145.goto end;

146. }

147.

148.if(register_android_media_FFMpegAVFrame(env) != JNI_OK) {

149. __android_log_print(ANDROID_LOG_ERROR, TAG, "can't load android_media_FFMpegAVFra me");

150.goto end;

151. }

152.

153.#ifdef BUILD_WITH_PLAYER

154.if(register_android_media_FFMpegPlayerAndroid(env) != JNI_OK) {//跳到----》com_media_ffmpeg_FFMpegPlayer.cpp文件

155. __android_log_print(ANDROID_LOG_ERROR, TAG, "can't load android_media_FFMpegPlaye rAndroid");

156.goto end;

157. }

158.#endif

159.

160. __android_log_print(ANDROID_LOG_INFO, TAG, "loaded");

161.

162. result = JNI_VERSION_1_4;

163.

164.end:

165.return result;

166.}

[cpp]view plaincopy

1.//com_media_ffmpeg_FFMpegPlayer.cpp文件

2./*

3. *

4. * 由于代码量较大,com_media_ffmpeg_FFMpegPlayer.cpp开始的一部分省略,只是贴出注册函数的相关部分。

5. */

6.static const char* const kClassPathName = "com/media/ffmpeg/FFMpegPlayer";

7./*

8. * 由于gMethods[]是一个<名称,函数指针>对照表,在程序执行时,

9. * 可多次调用registerNativeMethods()函数来更换本地函数的指针,

10. * 从而达到弹性调用本地函数的目的。

11. */

12.static JNINativeMethod gMethods[] = {

13. {"setDataSource", "(Ljava/lang/String;)V", (void *)com_media_ffmpeg_FF

MpegPlayer_setDataSource},

14. {"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)com_media_ffmpeg_FF

MpegPlayer_setVideoSurface},

15. {"prepare", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_prepare},

16. {"_start", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_start},

17. {"_stop", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_stop},

18. {"getVideoWidth", "()I", (void *)com_media_ffmpeg_FF

MpegPlayer_getVideoWidth},

19. {"getVideoHeight", "()I", (void *)com_media_ffmpeg_FF

MpegPlayer_getVideoHeight},

20. {"seekTo", "(I)V", (void *)com_media_ffmpeg_FF

MpegPlayer_seekTo},

21. {"_pause", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_pause},

22. {"isPlaying", "()Z", (void *)com_media_ffmpeg_FF

MpegPlayer_isPlaying},

23. {"getCurrentPosition", "()I", (void *)com_media_ffmpeg_FF

MpegPlayer_getCurrentPosition},

24. {"getDuration", "()I", (void *)com_media_ffmpeg_FF

MpegPlayer_getDuration},

25. {"_release", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_release},

26. {"_reset", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_reset},

27. {"setAudioStreamType", "(I)V", (void *)com_media_ffmpeg_FF

MpegPlayer_setAudioStreamType},

28. {"native_init", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_native_init},

29. {"native_setup", "(Ljava/lang/Object;)V", (void *)com_media_ffmpeg_FF

MpegPlayer_native_setup},

30. {"native_finalize", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_native_finalize},

31. {"native_suspend_resume", "(Z)I", (void *)com_media_ffmpeg_FF

MpegPlayer_native_suspend_resume},

32.};

33.

34.int register_android_media_FFMpegPlayerAndroid(JNIEnv *env) {

35.return jniRegisterNativeMethods(env, kClassPathName, gMethods, sizeof(gMethods) / sizeo

f(gMethods[0]));

36./*跳到OnLoad.cpp文件中的

37. * jint jniRegisterNativeMethods(JNIEnv* env,

38. const char* className,

39. const JNINativeMethod* gMethods,

40. int numMethods)

41.

42. */

43.}

Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld

1、Android NDK简介

NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发)。

简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jni(java native interface)层开发,SDK开发可以称为上层开发。

2、为何要用NDK

2.1、众所周知,利用SDK编写的代码,生成的APK,很容易就可以反编译了,安全性极为不高,而利用NDK开发的库,不容易被反编译,保密性,安全性都提高了。

2.2、很多开源工程和大型工程都是C&C++代码,把它们转换为纯java语言显然是不可能的。

2.3、C&C++的代码运行速度和效率都比java快很多。

3、NDK环境的搭建

在https://www.360docs.net/doc/a714819419.html,/sdk/ndk/index.html下载最新版的NDK,然后解压到你喜欢的位置,然后把NDK的所在的目录,配置到环境变量里面就行。

如我在windows下面用cygwin开发。配置环境变量可以参考

https://www.360docs.net/doc/a714819419.html,/conowen/article/details/7518870

简单来说就是在linux或者cygwin的安装目录,跳转到/home/YourName/,然后编辑.bash_profile文件,在末尾添加如下语句,具体根据自己的情况而定。

[java]view plaincopy

1.ndk=/home/conowen/android-ndk-r7b

2.

3.export ndk

4、新建一个NDK工程

新建一个目录,命名为HelloWorld,然后在里面新建一个名为jni的目录(名称一定要是jni,因为ndk-build 的时候会在HelloWorld目录下寻找jni的目录,然后进行build),在jni目录下新建如下文件HelloWorld.c 和Android.mk。

HelloWorld.c文件代码如下(此JNI是没有jni_onLoad函数的)

[java]view plaincopy

1.#include

2.#include

3.

4.jstring

5.Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,

6. jobject thiz )

7.{

8.return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");

9.}

10.

11.

12.

13.

14./*注意,这里

15.

16.jstring 表示返回值

17.

18.Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI

19.

20.写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。

21.包名:com_conowen_helloworld

22.Activity名:HelloWorldActivity

23.方法名:helloWorldFromJNI

24.

25.JNIEnv* env, jobject thiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个

helloWorldFromJNI是没有形参的。

26.*/

Android.mk代码如下

关于Android.mk的编写格式,下一篇博文补全

[java]view plaincopy

1.LOCAL_PATH := $(call my-dir)

2.

3.include $(CLEAR_VARS)

4.#LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写

5.LOCAL_MODULE := HelloWorld

6.LOCAL_SRC_FILES := HelloWorld.c

7.

8.include $(BUILD_SHARED_LIBRARY)

然后在终端里面,转到HelloWorld目录下,执行

[java]view plaincopy

1.$ndk/ndk-build

$ndk是之前配置的NDK环境变量。编译成功后,会在在目录生成libs和obj两个文件夹,libs里面有刚刚编译成的libHelloWorld.so库。

5、新建一个Android工程

在eclipse里面新建一个Android工程,java代码如下,然后把刚刚生成的libs文件夹拖到Android工程目录下。

[java]view plaincopy

1.package com.conowen.helloworld;

2.

3.import android.app.Activity;

4.import android.os.Bundle;

5.import android.widget.TextView;

6.

7.public class HelloWorldActivity extends Activity {

8./** Called when the activity is first created. */

9.@Override

10.public void onCreate(Bundle savedInstanceState) {

11.super.onCreate(savedInstanceState);

12.

13. TextView tv = new TextView(this);

14. tv.setText(helloWorldFromJNI());

15. setContentView(tv);

16. }

17.

18.public native String helloWorldFromJNI();// native声明,表示这个方法来自Native层。实现过

程已经在native层实现了

19.

20.static {

21. System.loadLibrary("HelloWorld");// 加载库,前面的lib和,后缀名不用写

22. }

23.}

效果图:

Android的NDK开发(3)————JNI数据类型的详解

在Java中有两类数据类型:primitive types,如,int, float, char;另一种为reference types,如,类,实例,数组。

注意:数组,不管是对象数组还是基本类型数组,都作为reference types存在,有专门的JNI方法取数组中每个元素。

1、void

java的void与JNI的void是一致的。

2、基本数据类型

3、对象类型

相比基本类型,对象类型的传递要复杂得多。不能对Jstring进行直接操作。

[cpp]view plaincopy

1.//如下使用方式是错误的,因为jstring不同于C语言中的char *类型。

2.Java_com_conowen_test_testActivity_test(JNIEnv *env, jobject obj, jstring str)

3.{

4./* ERROR: incorrect use of jstring as a char* pointer */

5.printf("%s", str);

6....

7.}

注意:

[cpp]view plaincopy

1.typedef jint jsize;

3.1、GetStringUTFChars与ReleaseStringUTFChars函数简单说明(跳到3.2有更方便的函数)

JNI支持Unicode/UTF-8字符编码互转。Unicode以16-bits值编码;UTF-8是一种以字节为单位变长格式的字符编码,并与7-bitsASCII码兼容。UTF-8字串与C字串一样,以NULL('\0')做结束符, 当UTF-8包含非ASCII码字符时,以'\0'做结束符的规则不变。7-bit ASCII字符的取值范围在1-127之间,这些字符的值域与UTF-8中相同。当最高位被设置时,表示多字节编码。

[cpp]view plaincopy

1.//调用GetStringUTFChars,把一个Unicode字串转成UTF-8格式字串

Java_com_conowen_test_testActivity_test(JNIEnv *env, jobject o bj, jstring str)

2.{

3.char buf[128];

4.const jbyte *cbyte;

5.cbyte= (*env)->GetStringUTFChars(env, str, NULL);

6.if (cbyte== NULL) {

7.return NULL;

8.}

9.printf("%s", cbyte);

10.(*env)->ReleaseStringUTFChars(env, str, cbyte);

11.

12.scanf("%127s", buf);

13.return (*env)->NewStringUTF(env, buf);

14.

//或者return (*env)->NewStringUTF(env, "hello world");

15. }

16.

17.

18.

19.

20.

上述函数中,有isCopy参数,当该值为JNI_TRUE,将返回str的一个拷贝;为JNI_FALSE将直接

指向str的内容。注意:当isCopy为JNI_FALSE,不要修改返回值,不然将改变https://www.360docs.net/doc/a714819419.html,ng.String的不可变语义。一般会把isCopy设为NULL,不关心Java VM对返回的指针是否直接指向https://www.360docs.net/doc/a714819419.html,ng.String的内容。

21.

注意:在调用GetStringChars之后,一定要调用ReleaseStringChars做释放,

(Unicode -> UTF-8转换的原因)。不管在调用GetStringChars时为isCopy赋值JNI_TRUE还是JNI_FALSE,因不同JavaVM实现的原因,ReleaseStringChars可能释放内存,也可能释放一个内存占用标记。

22.

23.

24.

25.3.2、GetStringRegion/GetStringUTFRegion函数简单说明

26.

因为这两个函数不涉及内存操作,所以较GetStringUTFChars使用要简单。也不用进行释放指针之类的操作,

非常方便。(推荐使用)

27.

28.

Java

_com_conowen_test_testActivity_test(JNIEnv *env, jobject obj, jstring str)

30.

31.char outputbuf[128], inputbuf[128];

32.int len = (*env)->GetStringLength(env, str);

33.(*env)->GetStringUTFRegion(env, str, 0, len, outbuf);

34.printf("%s", outputbuf);

35.scanf("%s", inputbuf);

36.return (*env)->NewStringUTF(env, inbuf);

37.}

38.

39.

40.

41.

42.

43.

44.GetStringUTFRegion有两个主要的参数,start 和 length, 这两个参数以Unicode编码计算. 该函数会做边

界检查,所以可能抛出StringIndexOutOfBoundsException。

45.

46.


47.

48.


49.

50.


51.

52.

3.3、GetStringLength/GetStringUTFLength函数简

单说明

53.


54.前者是Unicode编码长度,后者返回的是是UTF编码长度。

55.

56.

57.

58.

4、数组类型

59.

60.


61.

62.

JNI对每种数据类型的数组都有对应的函数。

63.


64.

65.

4.1、常见

错误操作:

66.

67.

68.

/* 直接操作数组是错误的 */

69.Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)

71.int i, sum = 0;

72.for (i = 0; i < 10; i++) {

73.sum += arr[i];

74.}

75.}

76.

77.

4.2、使用

void GetArrayRegion(JNIEnv *env, array, jsize start,jsize len, *buf);进行操作

78.

参数说明:

79.

env: the JNIEnv interface pointer.

80.array: a reference to an array whose elements are to be

copied.将要被拷贝的目标数组

81.start: the starting index of the array elements to be co

pied.(数组的起始位置)

82.len: the number of elements to be copied.(拷贝元素的个数)


83.buf: the destination buffer.存放结果的本地数组

84.

返回值:void

85.

86.


87.

88.

89.

Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr

)

90.{

91.jint buf[10];

92.jint i, sum = 0;

93.(*env)->GetIntArrayRegion(env, arr, 0, 10, buf);

94.for (i = 0; i < 10; i++) {

95.sum += buf[i];

96.}

97.return sum;

98.}


99.

100.

101.

JNI中数组的基类为jarray,其他如jintArray都是继承自jarray。

102.

103.

104.

4.3、使用

*GetArrayElements(JNIEnv *env, array, jboolean *isCopy);进行数组操作

105.

106.

107.

参数说明:

108.

env: the JNIEnv interface pointer.array: a referenc

e to the primitive array whose elements are tobe accessed.(目标数组)

109.

isCopy: a pointer to a jboolean indicating whether

a function

110.


111.

112.

返回值:返回指向Java数组的一个直接的指针

113.


114.

115.

116.

使用实例:

117.

118.

Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray a rr)

119.{

120.jint *carr;

121.jint i, sum = 0;

122.carr = (*env)->GetIntArrayElements(env, arr, NULL);

123.if (carr == NULL) {

124.return 0; /* exception occurred */

125.}

126.for (i=0; i<10; i++) {

127.sum += carr[i];

128.}

129.(*env)->ReleaseIntArrayElements(env, arr, carr, 0);

130.return sum;

131.}


132.)

133.

134.


135.

136.

更多数组操作函数:

137.

138.


139.

140.

5、另外一些有用的宏定义(来自jni.h)

141.

142.

#define JNI_FALSE 0

143.#define JNI_TRUE 1

144.

145.#define JNI_VERSION_1_1 0x00010001

146.#define JNI_VERSION_1_2 0x00010002

147.#define JNI_VERSION_1_4 0x00010004

148.#define JNI_VERSION_1_6 0x00010006

149.

150.#define JNI_OK (0) /* no error */

151.#define JNI_ERR (-1) /* generic error */

152.#define JNI_EDETACHED (-2) /* thread detached from the VM */ 153.#define JNI_EVERSION (-3) /* JNI version error */

154.

155.#define JNI_COMMIT 1 /* copy content, do not free buffer */ 156.#define JNI_ABORT 2 /* free buffer w/o copying back */ 157.


158.

159.

160.


161.

162.


163.

164.

165.

166.

167.

168.

169.

170.

171.

172.

173.

174.

175.

176.

177.

178.

179.

180.

181.

182.

183.

Android的NDK开发(4)————JNI数据结构之JNINativeMethod

1、JNINativeMethod 结构体的官方定义

[cpp]view plaincopy

1.typedef struct {

2.

3.const char* name;

4.const char* signature;

5.void* fnPtr;

6.} JNINativeMethod;

第一个变量name是Java中函数的名字。

第二个变量signature,用字符串是描述了Java中函数的参数和返回值

第三个变量fnPtr是函数指针,指向native函数。前面都要接(void *)

第一个变量与第三个变量是对应的,一个是java层方法名,对应着第三个参数的native方法名字

更多内容请查看之前博文:https://www.360docs.net/doc/a714819419.html,/conowen/article/details/7521340

示例:

[cpp]view plaincopy

1./*

2. * 由于gMethods[]是一个<名称,函数指针>对照表,在程序执行时,

3. * 可多次调用registerNativeMethods()函数来更换本地函数的指针,

4. * 从而达到弹性调用本地函数的目的。

5. *具体可以参看https://www.360docs.net/doc/a714819419.html,/conowen/article/details/7521340

6. */

7.static JNINativeMethod gMethods[] = {

8. {"setDataSource", "(Ljava/lang/String;)V", (void *)com_media_ffmpeg_FF

MpegPlayer_setDataSource},

9. {"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)com_media_ffmpeg_FF

MpegPlayer_setVideoSurface},

10. {"prepare", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_prepare},

11. {"_start", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_start},

12. {"_stop", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_stop},

13. {"getVideoWidth", "()I", (void *)com_media_ffmpeg_FF

MpegPlayer_getVideoWidth},

14. {"getVideoHeight", "()I", (void *)com_media_ffmpeg_FF

MpegPlayer_getVideoHeight},

15. {"seekTo", "(I)V", (void *)com_media_ffmpeg_FF

MpegPlayer_seekTo},

16. {"_pause", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_pause},

17. {"isPlaying", "()Z", (void *)com_media_ffmpeg_FF

MpegPlayer_isPlaying},

18. {"getCurrentPosition", "()I", (void *)com_media_ffmpeg_FF

MpegPlayer_getCurrentPosition},

19. {"getDuration", "()I", (void *)com_media_ffmpeg_FF

MpegPlayer_getDuration},

20. {"_release", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_release},

21. {"_reset", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_reset},

22. {"setAudioStreamType", "(I)V", (void *)com_media_ffmpeg_FF

MpegPlayer_setAudioStreamType},

23. {"native_init", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_native_init},

24. {"native_setup", "(Ljava/lang/Object;)V", (void *)com_media_ffmpeg_FF

MpegPlayer_native_setup},

25. {"native_finalize", "()V", (void *)com_media_ffmpeg_FF

MpegPlayer_native_finalize},

26. {"native_suspend_resume", "(Z)I", (void *)com_media_ffmpeg_FF

MpegPlayer_native_suspend_resume},

27.};

28.

主要是第二个参数比较复杂:

括号里面表示参数的类型,括号后面表示返回值。

"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Fun();

"(II)V" 表示void Fun(int a, int b);

这些字符与函数的参数类型的映射表如下:

2、第二个参数之基本数据类型

Android studio 开发安装教程

Android studio 安装教程 目录 Android studio 安装教程 (1) 1.JDK 的安装和Java 环境变量的设置 (2) 1.1 JDK 下载地址: (2) 1.2 安装JDK (2) 1.3、环境变量设置 (4) 2.Android studio 的安装 (7) 2.1 开始安装打开android studio 安装文件 (7) 2.2 缓存文件夹配置 (9) 2.3 打开Android studio (11)

1.JDK 的安装和Java 环境变量的设置 1.1 JDK 下载地址: https://www.360docs.net/doc/a714819419.html,/technetwork/java/javase/downloads/index.html JDK(Java Development Kit) 是整个Java 的核心,包括一系列Java 开发的东西,安装完毕需要配置一下环境变量。 1.2 安装JDK 安装JDK 本机是64 位,所以,选择jdk-7u21-windows-x64.exe 下载,下载完成后,进行安装

1.3、环境变量设置 1.3.1 我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量: 1.3. 2. JAVA_HOME JDK 的安装路径,这个环境变量本身不存在,需要创建,创建完则可以利用%JAVA_HOME% 作为统一引用路径,其值为:j d k在你电脑上的安装路径。 1.3.4 PATH PATH 属性已存在,可直接编辑。作用是用于配置路径,简化命令的输入,其值 为:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

一看就懂的Android APP开发入门教程

工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android开发入门文章,有一点开发基础的应该都能看懂。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择U SE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JAVA_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Andro id的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录即可。

Android Studio教程从入门到精通.doc

Android Studio教程从入门到精通 AS简介 经过2年时间的研发,Google终于正式发布了面向Android开发者的集成开发环境Android Studio 1.2(稳定版)。Android Studio是Google 开发的一款面向Android开发者的IDE,支持Windows、Mac、Linux 等操作系统,基于流行的Java语言集成开发环境IntelliJ搭建而成。该IDE在2013年5月的Google I/O开发者大会上首次露面,当时的测试版各种莫名其妙的Bug,但是14年12月8日发布的版本是稳定版。Android Studio 1.0推出后,Google官方将逐步放弃对原来主要的Eclipse ADT的支持,并为Eclipse用户提供了工程迁移的解决办法。不过相信作为Developer的你上手AS 1.0以后你再也不愿意使用原来苦逼的Eclipse+ADT了,你会被AS的各种强大所吸引。 下载安装 下载AS前先说下,AS安装包分为含SDK版本和不含SDK版本下载,如果你有SDK,那么完全可以下载不含SDK版本;不过下载了含SDK版本也没事,安装时选择自定义SDK也可以,安装后重新指定SDK路径也可以,总之看个人爱好喽。先吐槽下天朝的强大吧,不得不拜服天朝的墙。如果你有梯子请去Android Developer下载最新版的AS安装包,如果你没有梯子那也有个办法,就是去Android Studio中文社区官网下载你的平台需要的安装包。 下载下来以后安装的过程可以忽略了吧,能安装的都是程序猿吧,所以安装这点就不说了,注意已经正确安装配置了JDK。

Android开发入门教程

第一篇:安装SDK 这里主要介绍如何安装Android的SDK开发包和配置开发环境。如果你还没有下载SDK,点击下面的链接开始。 Download the Android SDK 系统和软件配置要求 要通过Android SDK中提供的代码和工具进行Android应用程序的开发,需要一个合适的用于开发的电脑和合适的开发环境,具体要求如下: 支持的开发环境 Eclipse Eclipse 3.2,3.3(Europa) Android开发工具插件(可选) 其他的开发环境或者IDE JDK5.0或者JDK6.0(仅有JRE是不够的) 安装SDK 下载好SDK包后,将zip文件解压缩至合适的地方。在下文中,我们默认你的SDK安装目录为$SDK_ROOT 你可以选择将$SDK_ROOT/tools加入到你的路径中 1.Linux下,打开文件~/.bash_profile或者~/.bashrc,找到设定PATH环境变量的一行,将$SDK_ROOT/t ools的完整路径加入其中。如果没有找到设定PATH变量的行,你可以自己添加一行: export PATH=${PATH}:<你的$SDK_ROOT/tools的完全路径> 2.Mac下,在你的home目录中找到文件.bash_profile,和Linux的一样处理。如果还没有在机器上设定这个文件,你可以创建一个.bash_profile文件。 3.Windows下,右键点击【我的电脑】,选择【属性】,在【高级】页中,点击【环境变量】按键,在弹出的对话框中双击“系统变量”中的变量“Path”,将$SDK/tools的完全路径加入其中。 通过将$SDK/tools加入系统路径,在运行adb和其它一些命令行工具时就不需要键入完全路径名了。需要注意到是,当你升级了SDK后,如果安装路径有变动的话,不要忘记了更新你的PATH变量的设置,将其指向变动后的路径。 安装Eclipse插件(ADT) 如果你选择Eclipse作为Android的开发环境,可以安装一个专门为Android定制的插件:Android Deve lopment Tools(ADT),ADT插件集成

Android基础教程

Android基础教程 开始之前 本教程介绍如何在Eclipse 环境中进行Android 应用程序开发,包括两个示例应用程序。第一个示例是一个基本的应用程序,涉及构建和调试的所有阶段。第二个应用程序示例涉及比较复杂的Android 特性,包括联系人搜索和Google Maps 地址查找。要想从本教程获得最大收益,具备移动开发经验会有帮助,但不是必需的。开发Android 应用程序需要Java? 编程技能,但是对于本教程不是必需的。 关于本教程 我们为什么要关注Android?有两个原因使Android 成为重要的平台。首先,Google 引入了Android,它在很短时间内就获得了市场的关注。Google 正在进军移动市场。它在这个市场上采取的第一个行动就是发布Android 和Open Handset Alliance,这是一个令人印象深刻的起点。第二,Android 不仅仅是另一种包含电话、菜单和触摸屏功能的移动平台。您将在本教程中了解到,Android 提供了一种不同的应用程序开发方法。由于可以对请求的操作和代码进行运行时绑定,Android 的体系结构支持高度可定制的软件环境。无论是考虑市场因素还是Android 的技术方面,它都是一个值得研究的平台。 本教程分为以下几节: Android 基础知识和必需的工具

?Android Software Developer Kit ?构建和调试SaySomething Android 应用程序 ?创建内容提供器和Google Maps 应用程序 系统需求 本教程需要结合使用几种技术。 Eclipse 平台 Eclipse 是一个运行插件的平台。您应该安装Eclipse Classic 的最新版本(本教程使用V3.3.1)。 Android Developer Tools 按照安装Android SDK中的说明安装Android Developer Tools(Eclipse 插件)。 源代码 本教程中的源代码片段包括: ?AndroidManifest.xml(片段)—这个文件是Android 应用程序的应用程序部署描述符。 ?IntentReceiver —演示IntentReceiver的实 现,这个类处理AndroidManifest.xml 文件中 IntentFilter标记所公布的intent。 ?SaySomething.java —实现一个Android 活动,这 是本教程的示例应用程序的主要入口点。

Android移动应用开发基础教程(微课版)-教学大纲

《Android移动应用开发基础教程(微课版)》教学大纲 学时:62 代码: 适用专业: 制定: 审核: 批准: 一、课程的地位、性质和任务 Android移动应用开发基础是普通高等学校计算机科学与技术专业的一门重要的专业基础课。通过本课程的学习,使学生能够在已有的计算机基础知识基础上,对Android移动应用开发有一个系统的、全面的了解、为掌握移动应用开发打下良好的基础;在系统理解和掌握Android移动应用开发基本原理的基础上,了解和掌握移动应用开发的基本原理和方法,具有设计和开发Android移动应用APP的基本能力。 Android移动应用开发是一门实践性非常强的学科,它要求学生在理解和掌握Android移动应用开发语言语法的基础上,充分利用实验课程,在计算机上动手完成程序的编写和调试。 二、课程教学基本要求 1.课程教学以Android移动应用开发方法为主,在教学过程中让学生掌握Android移动应用开发的基本原理和方法。 2.要求在教学过程中合理安排理论课时和实验课时,让学生有充分的使用在计算机上练习理论课程中学到的Android移动应用开发技巧和方法。 三、课程的内容 第1章 Android开发起步 让学生了解Android平台特点、体系架构和版本,掌握如何搭建Android开发环境,熟悉如何创建Android项目和Android编程的日志工具 第2章 Android核心组件:活动 让学生了解Android核心组件之一的活动是什么、活动生命周期,掌握活动基本操作、在活动中使用Intent、在活动之间传递数据、活动的启动模式。 第3章 UI设计 让学生熟练掌握线性布局、相对布局、通用UI组件、消息通知和菜单。 第4章广播机制 让学生了解广播机制,并熟练掌握如何使用广播接收器。 第5章数据存储 让学生熟练掌握Android文件存储、共享存储和SQLite数据库存储。 第6章多媒体 让学生熟练掌握播放多媒体文件、记录声音、使用摄像头和相册。 第7章网络和数据解析

2016尚学堂Android开发入门教程

android开发者资料大全 第一篇:安装SDK 这里主要介绍如何安装Android的SDK开发包和配置开发环境。如果你还没有下载SDK,点击下面的链接开始。 Download the Android SDK 系统和软件配置要求 要通过Android SDK中提供的代码和工具进行Android应用程序的开发,需要一个合适的用于开发的电脑和合适的开发环境,具体要求如下: 支持的开发环境 Eclipse Eclipse 3.2,3.3(Europa) Android开发工具插件(可选) 其他的开发环境或者IDE JDK5.0或者JDK6.0(仅有JRE是不够的) 安装SDK 下载好SDK包后,将zip文件解压缩至合适的地方。在下文中,我们默认你的SDK安装目录为$SDK_ROOT 你可以选择将$SDK_ROOT/tools加入到你的路径中 1.Linux下,打开文件~/.bash_profile或者~/.bashrc,找到设定PATH环境变量的一行,将$SDK_ROOT/tools的完整路径加入其中。如果没有找到设定PATH变量的行,你可以自己添加一行: export PATH=${PATH}:<你的$SDK_ROOT/tools的完全路径> 2.Mac下,在你的home目录中找到文件.bash_profile,和Linux的一样处理。如果还没有在机器上设定这个文件,你可以创建一个.bash_profile文件。 3.Windows下,右键点击【我的电脑】,选择【属性】,在【高级】页中,点击【环境变量】按键,在弹出的对话框中双击“系统变量”中的变量“Path”,将$SDK/tools的完全路径加入其中。

《Android移动应用基础教程》中国铁道出版社课后习题(附答案)

Android 移动应用基础教程 习题答案 姓名: 班级: 联系方式:

第1章Android基础入门 一、填空题 1、Android是Google公司基于Linux平台开发的手机及平板电脑的操作系统 2、Android系统采用分层结构,由高到低依次为应用程序层、应用程序框架层、核心类库、Linux 内核。 3、ADB的常见指令中,用于开启ADB服务的是adb start-server。 4、在Android程序中,src目录用于放置程序的java代码文件。 5、Android程序开发完成后,如果要发布到互联网上供别人使用,需要将程序打包成.apk文件。 二、判断题 1、Android实际上就是一个手机。× 2、WCDMA是中国自己独自定制的3G标准,中国移动使用的就是这种标准。× 3、android第一个版本Android 1.1是2008年9月发布的。√ 4、gen目录是自动生成的,主要有一个R.java文件,该文件可手动修改。× 5、AndroidManifest.xml文件是整个程序的配置文件。√ 三、选择题 1、随着智能手机的发展,移动通信技术也在不断升级,目前应用最广泛的是(C) A、1G B、2G C、3G D、4G 2、ADT Bundle中包含了三个重要组成部分,分别是(ABC) A、Eclipse B、SDK C、SDK Manager,exe D、ADB 3、应用程序层是一个核心应用程序的集合,主要包括(B) A、活动管理器 B、短信程序 C、音频驱动 D、Dalivik虚拟机 4、ADB的常见指令中“列出所有设备”的指令是(C) A、adb uninstall B、adb install C、adb device D、adb emulator -avd 5、创建程序时,填写的Application Name表示(A) A、应用名称 B、项目名称 C、项目的包名 D、类的名字 四、简答题 1、简要说明Android体系结构中每个层的功能。 Android体系结构总共包含四层,分别是: ●应用程序层:设备上安装的软件应用都属于这一层 ●应用程序框架层:包含应用API ●核心类库:包含系统库和运行环境,系统库包含了底层C代码;运行环境包含了Java 的核心库和Dalvik虚拟机 ●Linux内核:提供Android的底层驱动。 2、简要说明ADB Bundle开发工具中SDK的作用。 SDK包含了Android的API源代码、各种工具、示例工程、用到的各种资源模板等。

Android官方开发教程中文版(二)

Android官方开发教程中文版 添加操作栏 添加操作栏 操作栏是你能为你的Activity实现的重要的设计元素之一,它提供了几种用户界面特性,使你的应用能够保持和其它应用的一致性,以便用户很快熟悉它。主要功能包括:1.用专门的空间为你的应用指定标识并且指示出用户在应用中的位置。 2.以可预测的方式访问重要的操作(如搜索) 3.支持导航和视图切换(使用选项卡或下拉列表) 本课程提供了关于操作栏基础知识的快速指南,要获得关于操作栏各种特性的更多信息,请参考“操作栏”指南。 设置操作栏 操作栏的最基本形式是为Activity显示标题以及在标题左边显示应用图标。即使是这种简单的形式,操作栏也有利于通知用户当前的位置,以及为你的应用保持一致性。 操作栏包括一个应用图标和Activity标题 设置一个基本的操作栏需要你的应用使用一个Activity主题并启用操作栏。如何获取这样一个主题取决于你的应用支持的最低Android版本。因此这节课根据你的应用支持的Android最低版本分为两个部分。 仅支持Android3.0及以上版本 从Android3.0开始(API级别11),操作栏被包含在所有使用Theme.Holo(或它的派生类)主题的Activity中,当targetSdkVersion或minSdkVersion的值大于等于11时,Theme.Holo 是默认主题。 因此,要在Activity中添加操作栏,只需简单地把这两个属性之一的值设为11或更高就可以了,如:

Android APP开发入门教程

Android APP开发入门教程 这篇文章主要介绍了Android APP开发入门教程,从SDK下载、开发环境搭建、代码编写、APP打包等步骤一一讲解,非常简明的一个Android APP开发入门教程,需要的朋友可以参考下。 工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android 程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android 开发入门文章,有一点开发基础的应该都能看懂。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择USE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JAVA_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK 包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Android的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK 目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录即可。

入门-Android从入门到精通

1 Android 开发从入门到精通Array Android 开发从入门到精通 Android 是一种基于Linux? V2.6 内核的综合操作环境。最初,Android 的部署目标是移动电话领域,包括智能电话和更廉价 的翻盖手机。但是,Android 全面的计算服务和丰富的功能支持完全有能力扩展到移动电话市场以外。Android 也可以用于其他 的平台和应用程序。本专题提供的教程、技术文章首先带大家了解Android 开发,进而深入到Android 开发的各个方面。 Android 开发入门 ?Android 开发简介 Android 是Google 提供的移动、无线、计算机和通信平台。通过使用Android Eclipse 插件,可以在强大的Eclipse 环境中构建Android 应用程序。本教程介绍如何用Eclipse 插件Android Development Tools 进行Android 应用 程序开发,包括对Android 平台和Android Development Tools 的介绍,并开发两个示例应用程序。 ?用Eclipse 开发Android 应用程序 Android 是一种基于Linux? V2.6 内核的综合操作环境。最初,Android 的部署目标是移动电话领域,包括智能电话 和更廉价的翻盖手机。但是,Android 全面的计算服务和丰富的功能支持完全有能力扩展到移动电话市场以外。Android 也可以用于其他的平台和应用程序。在本文中,阅读对Android 平台的简介,并学习如何编写基本的Android 应用程序。Array深入Android 开发 ?手机上的Scala Android 操作系统为移动开发提供强大、开放的平台。它利用了Java 编程语言和Eclipse 工具平台的威力。现在,还 可以将Scala 编程语言加入到其中。在本文中,您将看到如何使用Scala 作为Android 上的主要开发语言,从而可以 使用一种更具表达力、更加类型安全的编程语言编写移动应用程序。 ?构建Android 手机RSS 阅读器 本教程将展示如何使用Android Developer Tools 读取、解析和显示XML 数据。构建一个运行在Android 平台上的 RSS 阅读器,并集成不同的RSS 或其他XML 数据源以构建自己的mash-up 应用。 ?Android 助力云计算 开源的Android 操作系统已经席卷全球,它允许您在任何位置运行复杂的云计算应用程序。它设计用于在电池供电设备(如 T-Mobile G1 智能电话)上高效工作,Android 本质上就是Linux,Android 编程模型有多个层,允许创建为云计算量 身定做的安全应用程序。使用Android 达到新的高度并体验前所未有的移动计算吧。 ?使用Android 实现联网 Android 是面向应用程序开发的丰富平台,它提供一套出色的用户界面元素和数据管理功能。它还为开发连接到真实世界 的应用程序提供了出色的网络选项。您希望连接到哪里?也许您希望告诉全世界您正在使用Twitter。或者希望收到有关 在本地洗衣店或熟食店的排号。如果希望将Android 连接到您所生活的世界,那么请阅读本文。 ?深入探讨Android 传感器 Android 是一个面向应用程序开发的富平台,它拥有许多具有吸引力的用户界面元素和数据管理功能。Android 还提供了 一组丰富的接口选项。在本文中,学习如何配合使用Android 的各种传感器选项监控您的环境。样例代码展示了如何在 Android 电话中录制音频。想构建自己的婴儿监视器吗?想用声音来接听电话或者打开房门吗?请学习如何利用配备有 Android 的设备的硬件功能。

最新最全android开发视频教程

最新最全android开发视频教程 这是本站收集整理的android方面的开发视频教程,仅供大家下载,学习; ★视频目录★ 第一部分:百度云网盘存储 第01套尚学堂_高明鑫_全网最新、最牛、最全andriod视频教程 第02套Android之手机安全卫士开发教程+源码 第03套Android之自定义View(李科霈)开发教程+源码 第04套开发Android多媒体软件系列视频 第05套Android阿福多媒体播放器开发教程+源码 第06套Android系统的手机防盗软件的实现 第07套Android的软件管理器的开发教程 第08套Android地图搜索应用——美食天下 第09套大话优酷、酷六类视频网站Android客户端软件开发 第10套88个经典Android应用程序打包下载 第11套3G手机Android应用新浪微博项目开发教程 第12套UML和红孩子客户端独立项目开发讲解+源码 第13套安卓之微信项目开发实战教程+源码 第14套安卓之好友互动项目开发实战教程+源码 第15套Android之新浪微盾(殷凯)的开发教程+源码+资料 第16套传智播客Android之病毒与反病毒开发教程+源码 第17套Android社交分享平台——口袋微博 第18套北风网Android之新浪微博项目开发教程(沈大海)+资料+源码第19套北风网Android应用实战淘宝网手机客户端全程实录+源码 第20套Android系统的手机防盗软件的实现+源码 第21套基于Android的软件管理器开发教学视频 第22套开发Android移动互联网应用视频

第23套疯狂Java李韩飞老师Android项目新浪微博实战教程+PPT 第24套Android之豆瓣项目开发教程+源码 第25套Mars老师Android开发教学视频 第26套Android开发入门视频教程高清版 第27套《Android开发视频教程》全四季 第28套【张泽华】android视频教程 第29套Android开发视频教程 第30套Android开发基础视频教程 第31套手机安全卫士项目开发视频 第32套Android开发视频教程第三季 第33套Android开发视频教学视频教程第二季mars老师制作 第34套3G手机Android应用开发 第35套Android开发从零开始 第36套新浪微博Android OAuth2.0授权视频教程 第37套Sundy‘s Android高级应用开发课程共享版 第38套基于Android的通讯录开发教学视频 第39套腾讯微博Android客户端开发 第40套Android2.3源码下载 第41套8天快速掌握Android视频 第42套Google Android开发入门与实战视频 第43套老罗Android视频教程详解篇 第44套轻松几步学Android开发视频教程 第45套Android应用开发之高级应用 第46套Android学习资料大全 第47套Android深入浅出之基础篇 第48套android高级应用课程共享 第49套Android深入浅出 第50套老罗Android开发视频教程-安卓巴士 第51套黑马程序员_黎活明_Android核心基础视频教程 第52套新浪微博Android开发视频教程

Android应用开发入门教程(经典版)

Android应用开发入门教程(经典版) Linux公社(https://www.360docs.net/doc/a714819419.html,)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC 就是关于Linux的数据中心。 https://www.360docs.net/doc/a714819419.html,提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。

目录 第一篇Android系统结构和SDK使用 (5) 第1章 Android的系统介绍 (5) 1.1 系统介绍 (5) 1.2 软件结构和使用的工具 (7) 第2章 Android SDK的开发环境 (10) 2.1 Android SDK的结构 (10) 2.2 Android SDK环境安装 (11) 2.2.1. 安装JDK基本Java环境。 (11) 2.2.2. 安装Eclipse (12) 2.2.3. 获得Android SDK (12) 2.2.4(1). 在Eclipse 3.4(Ganymede)中安装ADT (14) 2.2.4(2). 在Eclipse 3.5(Galileo)中安装ADT (17) 2.2.5. 在Eclipse中配置Android SDK (20) 2.3 Android中运行仿真器环境 (21) 2.3.1. 建立Android虚拟设备 (21) 2.3.2. 运行虚拟设备 (22) 2.3.3. 使用Android中的工具 (23) 2.3.4. 使用logcat (24) 2.3.5. 使用仿真器控制 (25) 2.3.6. 命令行工具adb、mksdcard等 (26) 2.3.7. 使用设备控制 (28) 2.4 Android中建立工程 (29) 2.4.1. 建立工程 (29) 2.4.2. 查看和编辑各个文件 (31) 2.4.3. 运行工程 (33) 第二篇 Android应用程序的概述和框架 (36) 第3章 Android应用层程序的开发方式 (36) 3.1 应用程序开发的结构 (36) 3.2 API参考文档的使用 (36) 第4章Android应用程序示例 (40) 4.1 HelloActivity程序的运行 (40) 4.2 HelloActivity的源文件结构 (41) 4.2.1.Android.mk文件 (41) 4.2.2.AndroidManifest.xml文件 (42) 4.2.3.源代码文件 (42) 4.2.4.布局文件 (43) 4.2.5.其他资源文件 (43) 4.3 HelloActivity的编译结构 (43) 4.4 SkeletonApp的程序的运行 (44) 4.5 SkeletonApp的源文件结构 (44) 4.6 SkeletonApp的编译结构 (46) 第5章 Android应用程序的内容 (47) 5.1 Android应用程序的概念性描述 (47) 5.1.1.应用程序的组成部分 (47) 5.1.2.应用程序的生命周期 (48) 5.2 应用程序包含的各个文件 (50) 5.3 使用am工具启动Android应用程序 (51) 2

Android APP开发入门教程_新手必学

Android APP开发入门教程 工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android开发入门文章,有一点开发基础的应该都能看懂。 当然如果你是一个初学者,你如果每天晚上有时间,你可以加企鹅(444—513_089)晚上免费和安卓开发经验丰富的架构师一起学习安卓,并获取之前的高清视频和工具以及源码。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择USE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JA V A_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK 支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Android的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录 即可。

《Android移动应用基础教程》_习题的答案解析

《Android移动应用基础教程》习题答案 第1章Android基础入门 一、填空题 1、Linux、操作系统 2、应用程序层、应用程序框架层、核心类库、Linux内核 3、adb start-server 4、java代码文件 5、打包成.apk文件 二、判断题 1、× 2、× 3、√ 4、× 5、√ 三、选择题 1、D 2、ABC 3、B 4、C 5、A 四、简答题 1、Android体系结构总共包含四层,分别是: ●应用程序层:设备上安装的软件应用都属于这一层 ●应用程序框架层:包含应用API ●核心类库:包含系统库和运行环境,系统库包含了底层C代码;运行环境包含了Java 的核心库和Dalvik虚拟机 ●Linux内核:提供Android的底层驱动。 2、SDK包含了Android的API源代码、各种工具、示例工程、用到的各种资源模板等。 第2章Android UI开发 一、填空题 1、RelativeLayout、LinearLayout、TableLayout、GirdLayout、FrameLayout、AbsoluteLayout 2、android:layout_alignParentLeft 3、水平、竖直 4、RelativeLayout 5、显示全部信息、显示调试信息、显示一般信息、显示警告信息、显示错误信息 二、判断题 1、√ 2、√ 3、× 4、√ 5、× 三、选择题 1、D 2、B 3、C 4、D 5、B 四、简答题 1、使用Toast可以直接调用Tosast的静态方法: Toast.makeText(this, text, duration).show(); 也可以创建出Toast对象,如:

安卓app开发学习教程

安卓app开发学习教程 分享安卓app开发学习教程,Android从入门到初级,自学路线可以参照如下Android学习路线图。初级不需求大求全,先求实用、会用、熟练。在当前科技发展形势之下,IT行业的发展日益受到社会的重视,其对人才的重视度也相应提高。尤其是当前android 人才缺口已高达30万之多,并有逐年扩大的趋势,android行业开始惜才如金。众企业重金求贤而不能,android工程师薪资急剧上涨。所以学习安卓app开发的人也逐步攀升。 今天,涉及通信产业链中的每个环节,都有Android的身影,Android是第一款完全完整打通了整个通信产业链中的操作系统,手机方案商、集成商、运营商、内容提供商、用户,都在玩Android,都惊讶于Android的爆发式增长速度,Android现在每天有超过50万台新的Android设备启用。

随着Android平台的扩张,引发了Android人才荒,未来人才需求缺口将达百万。但符合条件的Android工程师屈指可数,企业招聘难度可想而知。据新京报等媒体报道Android工程师一年经验月薪8000元,对此李开复曾在微博谏言学生转学Android软件开发。我们相信,在未来几年内,Android开发工程师将成为3G行业炙手可热的岗位之一。下面分享一位朋友的Android学习路线图。 1、java基础知识;集合、线程和IO流主要掌握 2、web开发:servlet和jsp和html相关内容 3、服务器端的开发:jdbc使用结合mysql的使用 4、Android的入门介绍 5、Android常用布局

6、Android常用的ui控件listview、fragment 7、Android文件操作包括数据库等 8、Android网络协议部分包含json和xml的数据解析 9、Android输入事件、菜单对话框和通知等等 10、关于Android的ui的美化 11、Android自定义的控件等等 12、Android的传感器开发等等 13、Android的地图开发等等 14、Android线程和异步任务开发等。 Android平台是建立在Linux基础上,以Java语言为主的一个操作系统平台。它的开发涉及到很多方面,但其实并不复杂,上面的路线图看似需要学习的内容很多,但其实每个小知识点基本掌握并不需要花太长时间,按照上面的路线图进行学习之后,一般人就可以开发出简单的Android程序,或者能看懂网上的Android代码和实例,进行下一步的学习。 希望此路线图对即将开始学习Android开发的人有所帮助。

安卓app开发教程

安卓app开发教程 分享安卓app开发学习教程,Android从入门到初级,自学路线可以参照如下Android学习路线图。初级不需求大求全,先求实用、会用、熟练。在当前科技发展形势之下,IT行业的发展日益受到社会的重视,其对人才的重视度也相应提高。尤其是当前android 人才缺口已高达30万之多,并有逐年扩大的趋势,android行业开始惜才如金。众企业重金求贤而不能,android工程师薪资急剧上涨。所以学习安卓app开发的人也逐步攀升。 今天,涉及通信产业链中的每个环节,都有Android的身影,Android是第一款完全完整打通了整个通信产业链中的操作系统,手机方案商、集成商、运营商、内容提供商、用户,都在玩Android,都惊讶于Android的爆发式增长速度,Android现在每天有超过50万台新的Android设备启用。

随着Android平台的扩张,引发了Android人才荒,未来人才需求缺口将达百万。但符合条件的Android工程师屈指可数,企业招聘难度可想而知。据新京报等媒体报道Android工程师一年经验月薪8000元,对此李开复曾在微博谏言学生转学Android软件开发。我们相信,在未来几年内,Android开发工程师将成为3G行业炙手可热的岗位之一。下面分享一位朋友的Android学习路线图。 1、java基础知识;集合、线程和IO流主要掌握 2、web开发:servlet和jsp和html相关内容 3、服务器端的开发:jdbc使用结合mysql的使用 4、Android的入门介绍 5、Android常用布局

6、Android常用的ui控件listview、fragment 7、Android文件操作包括数据库等 8、Android网络协议部分包含json和xml的数据解析 9、Android输入事件、菜单对话框和通知等等 10、关于Android的ui的美化 11、Android自定义的控件等等 12、Android的传感器开发等等 13、Android的地图开发等等 14、Android线程和异步任务开发等。 Android平台是建立在Linux基础上,以Java语言为主的一个操作系统平台。它的开发涉及到很多方面,但其实并不复杂,上面的路线图看似需要学习的内容很多,但其实每个小知识点基本掌握并不需要花太长时间,按照上面的路线图进行学习之后,一般人就可以开发出简单的Android程序,或者能看懂网上的Android代码和实例,进行下一步的学习。 希望此路线图对即将开始学习Android开发的人有所帮助。

APP开发入门教程

APP开发入门教程 这篇文章主要介绍了Android APP开发入门教程,从SDK下载、开发环境搭建、代码编写、APP打包等步骤一一讲解,非常简明的一个Android APP开发入门教 程,需要的朋友可以参考下 作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android开发入门文章,有一点开发基础的应该都能看懂。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择USE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JA V A_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK 包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Android 的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录即可。

安卓开发初级教程

Android程序开发初级教程(一) 开始 Hello Android 平台简介 令人激动的Google手机操作系统平台-Android正式发布了,这是一个开放源代码的操作系统,内核为Linux. 作为开发者,我们所关心的是这个平台的架构以及所支持的开发语言。下面是这个平台的架构模型: 这个平台有以下功能:

+ Application framework: 可重用的和可替换的组件部分,在这个层面上,所有的 软件都是平等的。 + Dalvik virtul machine: 一个基于Linux的虚拟机。 + Integrated browser: 一个基于开源的WebKit引擎的浏览器,在应用程序层。 + Optimized graphics: 包含一个自定义的2D图形库和基于OpenGL ES 1.0 标 准的3D实现。 + SQLite: 数据库 + Media support: 通用的音频,视频和对各种图片格式的支持(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) + GSM Telephony: GSM 移动网络, 硬件支持。 + Bluetooth, EDGE, 3G, and WiFi: 都依赖于硬件支持。 + Camera, GPS, compass, and accelerometer: 都依赖于硬件支持。 +Rich development environment: 包含一套完整的开发工具集,方便跟踪调试,内存检测和性能测试,而且提供了Eclipse的插件。 下面我们就来亲身体验一下Android程序的开发之旅。 先介绍一下开发环境,下面是对系统及相关软件的版本要求: 操作系统: Windows XP or Vista Mac OS X 10.4.8 or later (x86 only)

相关文档
最新文档