高级05-JNI接口-结合Java与C本地代码_第1页
高级05-JNI接口-结合Java与C本地代码_第2页
高级05-JNI接口-结合Java与C本地代码_第3页
高级05-JNI接口-结合Java与C本地代码_第4页
高级05-JNI接口-结合Java与C本地代码_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中程在线(北京)科技有限公司内部教程注意保密Android高級課程

AndroidNativeC语言教学

C的起源-1970年代﹐李查(D.Richie)及汤普士(K.Thompson)任职于美国贝尔实验室(BellLabs)。汤普士正设计Unix操作系统﹐李查负责设计新语言来撰写Unix程序。新语言继承汤普士原设计的B语言﹐称为C语言。数学函数(Function)观念﹐被应用到C语言中﹐成为C程序的基本组件。

例如sin()、cos()等。在C的编程时,可自行定义函数,如:f(x)=x*x

就是一个函数﹐括号内的x为参数。如果x值为5﹐f(5)=5*5=25﹔此时f(5)函数值是25。

C的基本结构

1.前置处理器(Preprocessor):-前置处理器的任务是﹕在编译(Compile)之前把原始程序先整合﹐再交给编译程序(Compiler)处理。

C的特殊结构2.定义宏(Macro):-人有正名(本名)﹐也有别名﹐通常别名较亲切。程序内之常数或变量也能有涵意深刻之别名。令程序更有人情味﹐更亲切。有了别名﹐就可使用别名﹐亦可用本名。前置处理器(Preprocessor)将别名转成正名﹐才交由编译程序(Compiler)编译之。

常数的别名(如PI)﹐通称为「宏常数」﹔若别名中含有参数(Argument)﹐就类似一般函数﹐通称为「宏函数」。

#defineTRUE1#defineFALSE0#defineNewLine'\n'chardigit(chark){

return((k>='0'&&k<='9')?TRUE:FALSE);

}

int

main(void)

{

charch;

while((ch=getchar())!=NewLine)

if(digit(ch))

printf("DIGIT\n");else

printf("NotDigit\n");

return0;}

例如:这程序含三个宏常数──TRUE、FALSE及NewLine。TRUE代表1﹐使得程序的思路更清晰。FALSE及NewLine

也有同样效果。

前置处理器看到#define指示﹐就将TRUE还原为1﹐FALSE还原为0﹐且NewLine

还原为'\n'。处理后的结果:chardigit(chark)

{

return((k>='0'&&k<='9')?1:0);

}

int

main(void)

{

int

ch;while((ch=getchar())!='\n')

if(digit(ch))printf("DIGIT\n");else

printf("NotDigit\n");

return0;}

──────────────────────#definemax(x,y)((x)>(y)?(x):(y))#definemin(x,y)((x)<(y)?(x):(y))

#definesquare(x)((x)*(x))

#definecube(x)((x)*(x)*(x))#defineabs(x)((x)>0?-(x):(x))

#definerecip(x)((float)(x)=1.0/(float)(x))#defineodd(x)((x)&1?1:0)#defineeven(x)((x)&1?0:1)─────────────────────────────

写C程序时﹐常用下述宏函数﹕

●max(x,y)拿两数相比﹐挑出较大者。●min(x,y)则挑出较小值。●square(x)求x的平方。●cube(x)求x的立方。●abs(x)求x的绝对值。●recip(x)求x的倒数。●odd(x)判断x是否为奇数。●even(x)判断x是否为偶数。随时可引用上述宏﹐创造更多宏。3.取销宏:

-#define用来定义宏常数和函数。#undef指示恰好跟#define相反﹐用来取销已定义之宏常数或函数。

intAdd(intx){return(x+x);}

#define

Add(x)((x)+10)int

main(void){

intk=Add(8);

#undefAdd

inth=Add(8);

printf("k=%d,h=%d",k,h);

return0;}

例如:含入标头档(Header):

-写程序时﹐若想用这心爱宏﹐有两种方法﹕1.

把宏抄进C程序(*.c)中。2.把各宏归成「宏文件」﹐让程序含入之。这档案通称为「标头档」

(HeaderFile)﹐

/*Ex_macro.h*/

#defineTRUE1#defineFALSE0#defineCR'\r'#definePI3.1416#defineEOF(-1)#defineSign(x)((x)<0?FALSE:TRUE)

#defineArea(r)((r)*(r)*PI)#defineAND&&#defineREALfloat

例如:-此宏文件之个名字为﹕Ex_macro.h

-在C程序中﹐利用#include来含入标头档

/*Ex_macro.c*/#include<stdio.h>#include"Ex_macro.h"int

main(void){/*………*/}例如:#include是「含入」之意﹐其要求前置处理器并入标头档之内容﹐摆于#include指示的位置上。-标头文件的好处是﹕各程序(*.c)共享标头文件内之的宏。写复杂程序时﹐就得熟练运用标头档了。可随时修改标头文件内之宏﹐修改之后﹐再重新编译各模块(Module)即行了。

4.条件性定义:条件性定义(ConditionalDefinition)指示有﹕#ifdef

宏若已定义了此宏﹐就留下#ifdef与#endif

间的指令﹔否则删去之。#ifndef

宏若未定义过此宏﹐就留下#ifndef

#endif间的指令﹔否则删去之。#endif

说明#ifdef

及#ifndef

之范围。#undef

宏#define的相反动作──解除定义。#else可构成#ifdef~#else~#endif结构或是

#ifndef~#else~#endif结构。5.指针(Pointer):-指针(Pointer)就是某个变量的地址(Address)﹐也就是说,它用来指向该变量。-有人说C并不好学﹐何以致之呢﹖其来自于C程序中充满着「指针」(Pointer)观念﹐而许多人认为指标很难缠。其实指标观念并不如想象中的麻烦﹐只是有点不习惯罢了。

指针与数组:指针能指向数组内之任一元素。可藉指针来存取数组内之元素。所以﹐除了传统的数组存取方法之外﹐还可利用更有效率的指针处理方法。#include<stdio.h>int

main(void)

{

intdata[3];

int*px,*py;data[0]=5;

data[1]=28;data[2]=78;px=&data[0];py=&data[1];data[2]+=*px+(*py)++;printf("%d,%d,%d\n",data[0],data[1],data[2]);

return0;

}

例如:

px=&data[0]叫px指向元素data[0]。既然px指向data[0]﹐就可用*px

来代替data[0]﹐亦即可用*px

来存取data[0]之内容。py=&data[1]令py指向data[1]元素﹐此时可用*py

代替data[1]﹐用*py

存取data[1]之内容。

6.变量的储存种类:在大家庭中﹐每人都有自己的财产﹐也有属于家庭的公家财产。在C程序(犹如大家庭)中﹐每个函数有自己的变量﹐也有属于整个程序的公家变量。私有财产属于个人﹐别人无权使用﹔同样地﹐私有变量属于函数﹐别的函数无权存取之。

根据使用权限﹐变量可分为三类﹕自动(Automatic)变量隶属于一个函数﹐别函数无权使用。2.外部静态(ExternalStatic)变量

隶属于一个原始程序文件(*.c)﹐该档内的各

函数公用﹐但别文件内的函数无权使用。3.外部(External)变量

各函数公用。7.结构(Struct):结构能储存相关但不同型态之数据。例如

structsmile{

charsna;

charsize;floatprice;};这说明了﹕smile结构内含3项数据──两项字符数据﹐另一项浮点数数据。

8.动态内存分配:malloc()及free()「动态」(Dynamic)的意思是﹕待程序执行时(Run-Time)才告诉计算机共需要多少内存空间﹐计算机依照需要立即分配空间﹐裨储存数据。这种空间﹐又称为「动态数组」(DynamicArray)。传统数组的优点是﹕简单易用﹐其弱点是﹕缺乏弹性﹐动态内存分配的方法恰补足此项弱点。

malloc()和free()是最常用的动态内存分配函数。如果在执行时需要空间来储存数据﹐宜使用malloc()函数。例如﹕ptr=malloc(100);

这个指令要求计算机分配100bytes空间。malloc()函数会传回该空间的地址﹐且存入ptr

内﹐于是ptr

指向该空间。就可藉ptr

指标来存取此空间的数据了。

9.列举型态:-列举型态(EnumeratedDataType)是一堆常数的集合﹐这些常数称为「列举常数」(EnumeratedConstants)。例如﹕朴克牌有club、diamond、heart及spade四种牌﹐任意抽出一张﹐必定是上述4者之1。此时﹐可定义列举型态表达上述4种数据﹕

enum

朴克牌

{club,diamond,heart,spade};enum

week_day

{

monday,

tuesday,

wednesday,

thursday,

friday,

saturday,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论