day51_安卓项目开发基础JNI与底层调用

00_问题及复习

堆之中的内存管理:

    分成一个一个小段,然后将他们穿起来

你申请多大的空间,系统会将堆中相对最少的内存段给你,并不是真的给你多大的内存,所以申请来的内存很可能比申请的大

 

堆之中的内存不能重复释放,防止释放别人刚申请的内存空间

 

不能释放申请的一部分内存,不能逐步释放

 

 

01_指针的大小

根据CPU的位数或者操作系统的位数决定:

32位:4

64位:8

02_二级指针

二级指针变量存的是一级指针变量的地址

在32位平台上依然是4字节的长度

03_结构体类型及变量

 

04_结构体变量的成员访问方法

 

优先级

05_函数指针

函数在代码段的起始地址,函数入口地址

要加括号

C中不能定义变量

 

写函数指针的时候先确定参数,最后再写函数名

06_联合体与枚举

联合体:

枚举:0开始

07_typedef关键字

typedef 作用是给己经存在的数据类型

int a;//a是变量名,是一个标识符
					

 

typedef int a;//typedef a成为与int 完全等价的类型名
					

a b;//用类型别名定义变量
					

int c;//用原类型名定义量
					

 

a <=> int

struct Student *pstu;//pstu是一个结构体指针变量,是一个标识符
					

 

typedef struct Student *pstu;//typedef pstu成为了与struct Student*等价的类型别名
					

 

pstu k;

struct Student *m;

08_相关概念及工具介绍

交叉编译:

在一个平台上为另一个平台编译程序:不同的操作系统Windows Linux ,不同的处理器架构 Intel ARM

Host:编译程序的平台,主机

Target:运行程序的平台,目标机

 

主机编译:相当于自己倒酒喝

交叉编译:给别人倒酒喝

 

交叉编译工具链:编译套件提供一系列,顺序调用,形成链条

            arm-linux-gcc

使用工具:NDK(Native Development Kits)本地开发工具集

包含交叉编译工具链,但不止这些

 

NDK帮助我们生产本地库,并插入

CDT:C/C++ Development Tools 本质上是Eclipse的一个插件

Cygwin:已被封装到了NDK,在Windows提供了一个Unix模拟运行环境

 

09_NDK目录介绍

 

docs 开发文档推荐D:/android-ndk-r9d/documentation.html

Build目录:.mk 指导编译的配置文件

platform:安卓各个版本,系统头文件

premake:提供了一些编译编译工具

        make.exe:工程管理器,自动编译,需要自己写.mk文件

samples:例子

source:源码目录

toolchains:交叉编译的工具链

 

ndk-bulid.cmd: 包装了make工具,谷歌提供

 

 

10_JNI开发流程

 

阶段一 编码

  1. 创建Android工程,用native声明本地方法

由本地方法实现

  1. 需要在工程新建jni目录,实现.c的源文件

 

 

 

 

 

 

#include<jni.h>

/*

* jni规定本地方法名在实现的时候,本地方法名Java_调用本地方法类所在的包名以及类名

* 最后才是方法名

*

* JNIEnv *env java环境,提供函数供调用

* jobjectobj调用本地方法的对象

*

* typedef conststruct JNINativeInterface* JNIEnv;

* env :JNIEnv * <> struct JNINativeInterface **

* (*env) -> NewStringUTF();

*/

jstring Java_com_example_helloworld_MainActivity_helloFromC(JNIEnv *env,jobject obj){

 

    // c中字符1个字节,java两个字节

    // jstring (*NewStringUTF)(JNIEnv*,const char*);C的字符串转换成java里面的字符串

 

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

}

 

阶段二 编译

  1. 在jni目录下,新建Android.mk文件(固定)

 

LOCAL_PATH :=$(call my-dir)#指定当前路径

 

include$(CLEAR_VARS)     #清楚全局配置变量,LOCALXXX,除了LOCAL_PATH

 

LOCAL_MODULE :=hello #指定生成生成动态库名,libhello.so

LOCAL_SRC_FILES :=hello.c #指定生成动态库的源文件

 

include$(BUILD_SHARED_LIBRARY)#指定生成动态库

 

 

  1. 在jni目录下用ndk-build命令编译生成.so动态库(把ndk-build工具添加到path)
  2. 在类中动态加载动态库

 

static{

        System.loadLibrary("hello");// 动态库名,不是文件名(libhello.so)

    }

 

在path里面添加ndk的安装目录

程序目录不能有空格

 

**工程的名字不要以数字加下划线开头

 

11_JNI手动开发例子

 

 

12_JNI开发的常见错误

  1. 找不到动态库

Couldn't load resultfr0mc: findLibrary returned null

 

  1. 库名写错,或者生成动态库与运行平台不符合

  1. 找不到方法

 

清空.so文件:ndk-build clean

**工程目录不能加_

  1. 检查jni函数名写的对不对
  2. 没有加载库:System.loadLibrary("动态链接库名,不是.c");

 

13_javah命令使用

JNIEXPORT:作用域控制

 

全部不要加_(下划线)

在1.7之前在 /bin 目录中用 javah

在1.7及之后再 /src 目录中用 javah

 

14_eclipse结合NDK进行jni开发流程

 

  1. 新建工程,声明本地方法

  2. 指定工程添加 add Native support,修改其中源文件后缀为.c ,在Android.mk文件中也要修改

    见参考图片

  3. 指定jni.h头文件路径,见gif图片上面的
  4. 进入工程src目录执行javah命令(jdk1.7),进入bin/classes里面执行javah(1.6)

    把jni函数声明拷贝到.c源文件当中

  5. 实现本地jni函数
  6. 在类中调用加载动态库

 

15_中国人民很行客户端

 

可以用C对卡号和密码进行加密,即使反编译也是汇编代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值