C语言入门&JNI与地层调用——Day02_1

回顾:

指针  
	指针其实就是代表的内存地址  
	地址就是系统给内存分配的编号  
	
	指针变量  存放地址的变量  
	
	两个常见的错误 
	1 不给指针赋值 直接调用  野指针 
	2 指针类型和地址的类型不匹配  
		float t
		int* i=&t
	
	指针和指针变量混淆 
	
	int* p
	(*p).age; * 的优先级特别的低 
	
	
* 号的三种含义 
	1 乘法   
	2 如果*在类型后 代表是该类型的指针变量类型
	3 * 如果再指针变量前
	
	指针常见错误

	32 位	4G内存   8G 

	64位  
	int  2^32 
	
	.dll windows下库函数 
	.so 动态函数库   体积小 别的库里面的函数动态加载进来
	.a 静态的库函数 只要用到的函数包括别的包的 都打包进来
	
指针和数组的关系
	// 数组中的元素在一块连续的内存地址中 
	// 数组变量的内存地址对应的是数组中第一个元素的内存地址 
	同类型的指针默认的偏移量是不一样的 int*  偏移4个字节 
	
指针的运算 
	
	
内存分配 
	静态内存

	动态内存
 
	C语言 内存 
	.data  // 常量池  
	.code 区 // 存放的都是代码
		main();
	
	.stack;// 占内存  所有静态分配的内存 都放在栈内存中  吃完吐  连续分配         先进后出  队列 先进先出    吃完拉
	堆内存  // 动态分配的内存 都放在堆内存中,   不是连续分配内存的 
	  free() ;// 手动释放内存   硬盘删除文件     30次  
	  
	 malloc  memorry  alloc
		
// class Person{
	int  age;
	String name;
	char sex;'m'

}


 char* c 可以表示字符串


*01 ndk环境的搭建


windows .exe
        .dll

linux  elf    .so

1 编译阶段
2 连接阶段 

Java   -> .class  -> java的虚拟机 
C   -> .0中间文件 -> .exe   .dll
					.elf    .so   .a

linux  
	arm    .so
	x86 

windows 
	需要在windows下的环境 把c代码打包成 手机能用的函数库 
	首先模拟手机的环境 
	
	1  NDK    
		.sh linux 批处理文件 
		.bat  windows
		
		头文件  stdio.h   编译器     interface
		库函数            连接器     class 实现类
		
		由于ndk有很多linux的批处理文件 
		
	   最早基于linux开发 
	   
	 2  工具2  cygdriver 模拟linux系统环境  (windows操作系统)  
	 
	 linux系统的模拟器 
		linux 把所有设备都生成了一个文件
		
	3 cdt  为了方便在eclipse开发c代码  让c代码高亮显示
		c/c++  developer  tools
	  adt  
		android developer tools



*02 HelloWorldFromC







	交叉编译   怎么用java代码调用c代码 
	
	armeabi  // arme cpu   anroid binary interface
	
	// 1 定义一个c方法的接口   相当于在java代码中定义了一个接口 接口的实现方法是C语言实现的
	public native String helloWorldFromC();
	// // 2 步 实现C代码
	

	方法名 严格按照jni的规范 jstring Java_com_example_helloworldformc_MainActivity_helloWorldFromC(JNIEnv* env,jobject obj)   
	3 
	/ andrond.mk   告诉编译器 如何把c代码打包成函数库
	// 3 生成 .mk文件
	// 4步 把c代码 打包成函数库  用到了安装的环境
	
	// 5 步在java代码中 引入库函数 
	static{
		System.loadLibrary("hello");// 注意事项 去掉前面的lib 后面的.so
		
	}
	//6  使用方法



*03 jni 开发常见的错误

1 自动生成 java本地方法对应的c代码的方法名  javah 指令 +全雷鸣
	1.6  class  
		C:\workspace\HelloWorldFromC2\bin\classes
	1.7  src
		C:\workspace\HelloWorldFromC2\src 
		
		
Anroid.mk 文件 
	LOCAL_PATH := $(call my-dir)   // 返回当前c代码目录
	include $(CLEAR_VARS)        // 清楚了所有 已local 开头的配置文件 唯独不清楚LOCAL_PATH
	
	LOCAL_MODULE    := hello   // 库函数的名字  严格遵守makefile 格式  lib  .so  如果前面加lib 不会自动生成了
   LOCAL_SRC_FILES := Hello.c
	include $(BUILD_SHARED_LIBRARY)  // 加入库函数


jni 常见的错误
	1错误1  忘记方法的参数
	2 错误2 203-28 03:41:56.758: E/AndroidRuntime(821): java.lang.UnsatisfiedLinkError: Native method not found: com.example.error.DemoActivity.helloWorld:()Ljava/lang/String;
	3 错误3  一般没有日志打印 直接报错工程停止  一般c代码有运行错误
	4 错误4  在交叉编译的工具链上报错  c代码有编译错误  比如 一些函数没有声明  一些类型没有声明  少符号
	5 错误5 没有Android.mk 文件
	6 错误6 Android.mk 文件有错 
	7 错误7 引用别人.so 函数库  需要你自己native方法对应类的包名 和之前打包成.so函数库的包名一致


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值