JNI (java native interface) java本地开发接口(一句话 : 就是1个 adapter)。
JNI 是一个协议 - 是用来让 java代码和C,C++ 代码可以沟通(相互调用) 的一种协议 ,JNI 扩展了java虚拟机的能力 。
Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低。
Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能。
首先 要从最基本的开始 androd 调用 C,C++代码 肯定最起码代码不说会写,最起码是要能看懂和修改的,我把大1学的C语言也早早就忘光了哈哈。所以跟着复习点基础吧。
更深入的学习就有待以后吧 - -
C语言的基本数据类型:
char(C语言中 byte类型也是用 char), 1
int, 4
float, 4
double, 8
signed, 4 有符号的
unsigned, 4 无符号的
long, 4- 8根据编译器的不同
short, 2
C语言的输入和 输出:
%d - int
%ld – long int
%c - char
%f - float
%lf – double
%x – 十六进制输出 int 或者long int 或者short int
%o - 八进制输出
%s – 字符串
int a; //定义变量a
scanf("%d",&a); //从键盘上获取数据 放入a所在的 地址 &a
printf("a=%d\n",a); // 输出a的值
C语言的指针 - 这个是核心啦
int p =11; //32位操作系统 指针占 4个字节 64位占8个字
int* pp = &p;
printf("P的中存放的值: %d\n",p);
printf("P的地址是: %X\n",&p);
printf("PP指针变量存放的地址是: %X\n",pp);
printf("PP指针变量的大小: %d\n",sizeof(pp));
printf("PP指针变量存放的地址 - 对应的值: %d\n", *pp);
int* p; //定义一个指针变量 垃圾值
指针变量如果没有赋值就不能使用
int dd;
char* c; ; // 编译错误 不符合的指针类型
c = ⅆ
//printf("*p=%d\n",*p);
指针输出图:
C语言的多级指针:
int bb = 10;
int* m = &bb; //m存的是 (bb的内存地址 )
int** mm = &m; //mm 存的是 m指针变量的 -地址
printf("mm的值(m的内存地址) : %X\n", *mm);
printf("(m的内存地址) 所对应的值 = bb : %d\n", **mm);
printf("bb : %d\n", bb);
数组
int a[5] = {1,2,3,4,5};
printf("a0= %X\n", &a[0] ); // a表示的直接就是 数组a 的第一个元素所对应的内存区域
printf("a0= %X\n", &a );
printf("a0= %d\n", *(a+0));
printf("a1= %d\n", *(a+1));
printf("a2= %d\n", *(a+2));
printf("a3= %d\n", *(a+3));
//利用char类型指针 方便的表示一个字符串
char* arr1= "hello androd ndk";
printf("%s",arr1);
动态数组
// 6.动态的创建1个数组
int* aa = malloc(sizeof(int) * 6); //先申请1个能够存 6个 int的空间
aa = realloc(aa , sizeof(int)* 8); //变成 能放8个的 空间大小
*aa =0;
*(aa+ 1) =1;
*(aa+ 2) =2;
printf("aa1= %d\n", *(aa+1));
printf("aa2= %d", *(aa+2));
//free(aa); //用过后 不用了要自己手动释放
C语言的结构体
//结构体 - 这个就有点类似 java中的class了
struct ll{
int age;
char* name;
char* sex;
};
struct ll s={11, "lilei","boy"};
struct ll* lss;
printf("age = %d\n", s.age);
printf("name = %s\n", s.name);
printf("sex = %s\n", s.sex);
//2种方式
lss = &s;
printf("age = %d\n", lss->age);
printf("name = %s\n", lss->name);
printf("sex = %s\n", lss->sex);
联合体
union { long i; char ii; int iii; } pp ;
// 联合体的作用就是用来表示一组数据类型 数据的数据类型为这一组中的某一种数据类型
//注意 : 联合体里面的数据内容会相互覆盖
printf("pp:%d\n",sizeof(pp));
pp.ii = 'A';
printf("long=%ld\n",pp.i);
printf("char=%c\n",pp.ii);
printf("int=%d\n",pp.iii);
枚举
enum WeekDay
{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};
//其实就是一连串的数字而已
enum WeekDayNum
{
Monday1=50,Tuesday1,Wednesday1,Thursday1,Friday1,Saturday1,Sunday1
};
enum WeekDay day = Sunday;
enum WeekDayNum dayNum = Sunday1;
printf("day : %d\n",day);
printf("dayNum : %d\n",dayNum);
system("pause");
typedef
typedef int myInt;
myInt a = 10;
printf("myInt - a: %d\n",a);
#define STE_LEN 80
还有很多要复习的东西,先看这么多。
Message sent to deallocated instance
关于的ios 开发中 deallocated问题,相信大家遇到了不少了;
关于怎么查找解决这个问题,特别是当问题在tableView出现的时候,我今天又有一点的新的看法.
单方面去查找中这个问题问题不大,但是当整个程序耦合性很高的时候,稍微不注意就会造成数据的过度释放。
如果追踪deallocate问题技巧
自定义对象要实现归档必须实现NSCoding协议
NSCoding协议有两个方法,encodeWithCoder方法对对象的属性数据做编码处理,initWithCoder解码归档数据来初始化对象。
#import <Foundation/Foundation.h>
@interface user : NSObject <NSCoding>
@property(nonatomic,retain)NSString *name;
@property(nonatomic,retain)NSString *email;
@property(nonatomic,retain)NSString *pwd;
@property(nonatomic,assign)int age;
@end
#import "user.h"
#define AGE @"age"
#define NAME @"name"
#define EMAIL @"email"
#define PASSWORD @"password"
@implementation user
//对属性编码
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInt:_ageforKey:@"age"];
[aCoder encodeObject:_nameforKey:AGE];
[aCoder encodeObject:_emailforKey:EMAIL];
[aCoder encodeObject:_pwdforKey:PASSWORD];
}
//对属性解码
- (id)initWithCoder:(NSCoder *)aDecoder
{
self=[super init];
if(self)
{
self.age=[aDecoderdecodeIntForKey:AGE];
self.name=[aDecoderdecodeObjectForKey:NAME];
self.email=[aDecoderdecodeObjectForKey:EMAIL];
self.pwd=[aDecoderdecodeObjectForKey:PASSWORD];
}
return self;
}
-(void)dealloc
{
[_name release];
[_email release];
[_pwd release];
[super dealloc];
}
@end
main函数的调用
user *userObj=[[user alloc] init];
userObj.age=33;
userObj.email=@"adfdadf@qq.com";
userObj.pwd=@"212212";
userObj.name=@"ricard";
NSString *path=[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/custom.text"];
BOOL succ=[NSKeyedArchiver archiveRootObject:userObj toFile:path];
if (succ) {
NSLog(@"Hello, World!");
user *usertemp=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
}