JNI_day02
二级指针
指向指针变量的指针,保存指针的地址
结构体
struct Student //struct Stdent 学生结构体类型
{
int id;//成员
char name[20];
int age;
float score;
};
其中,Student为结构体名,struct Student表示结构体类型,相当于int等基本数据类型
访问结构体变量中的成员变量
(p).id = 3 <=> stu.id <=> p->id = 3
其中->为指向运算符,用于给结构体指针变量访问其指向结构体变量中的成员变量
函数指针
表示:函数在代码段的起始地址,函数入口地址
函数指针变量:函数的入口地址
同样,函数名也代表函数的入口地址
void funA();//函数声明
int funB(int a,int n);//函数声明
void (pfA)();//函数指针变量,可以保存funA地址
int (pfB)(int *,int);//函数指针变量的定义,可以保存funB函数的入口地址
结构体和联合体
结构体类型使用sizeof运算符计算出所占用空间大小为结构体中成员变量分别占用的大小总和
联合体类型使用sizeof运算符计算出所占用空间的大小为联合体中所占空间最大的那个类型
JNI开发流程
一、编码
1.创建Android工程,用native声明本地方法
2.在工程中新建jni目录,创建.c的源文件
include <jni.h>
/** jni规定 本地方法名 Java_调用本地方法类所在的包名_类名_方法名
JNIEnv * env java环境,提供函数供调用
jobject obj 调用本地方法的对象
typedef const struct JNINativeInterface* JNIEnv;
JNIEnv <=> struct JNINativeInterface*
env : JNIEnv * <=> struct JNINativeInterface**
(*env)->NewStringUTF();
*/
jstring Java_com_itheima_helloworld_MainActivity_helloFromC(JNIEnv *env, jobject obj){//jstring (NewStringUTF)(JNIEnv, const char*); 把C字符串转化为java中字符串
// 把C字符串转化为java中字符串
return (*env)->NewStringUTF(env,"hello world");
}
二、编译
3.在jni目录下新建Android.mk文件
LOCAL_PATH := $(call my-dir) #提定当前路径
include $(CLEAR_VARS) #清除全局配置变量,LOCAL_XXX,除了LOCAL_PATH
LOCAL_MODULE := hello #指定生成动态库名hello,生成的动态库文件libhello.so
LOCAL_SRC_FILES := hello.c #指定生成动态库的源文件
include $(BUILD_SHARED_LIBRARY) #提定生成动态库
4.在jni目录下用ndk-build命令编译生成.so动态库(需要把ndk-build工具路径添加到系统path环境变量中)
5.在类中加载动态库
static{
System.loadLibrary("hello");//加载动态库名而不动态库文件名
}
JNI开发过程中的常见错误
a.找不到动态库
解决方案:库名错误或者生成的动态库与运行平台不符
b.找不到方法
解决方案:检查JNI的方法名是否符合规则或者Java调用的方法是否正确
javah命令的使用
a.在jdk1.6中,需要在工程的classes目录下执行,生成头文件
b.在jdk1.7中,需要在工程的src目录下执行,生成头文件
结合Eclipse和NDK的JNI开发流程
- 1.新建Android工程,声明本地方法
- 2.指定工程添加 add Native suport,修改其中源文件后缀为.c,在Android.mk文件中也要修改,见gif图片add ndk location2.gif
- 3.指定jni.h头文件路径见gif图片include jni head file.gif
- 4.进入工程src目录执行javah命令(jdk1.7),进入工程bin\classes执行javah。把jni函数声明拷贝到.c源文件中
- 5.实现本地jni函数
- 6.在调用类中加载动态库
Java反射的复习
//1.装载字节码
Class<?> clazz = Demo.class.getClassLoader().loadClass("Dialog");
//2.查找方法
Method method = clazz.getDeclaredMethod("showDialog", String.class);
//3.调用方法
method.invoke(clazz.newInstance(), "利用反射调用Dialog中的showDialog方法");
C调用Java中的方法(类似Java中的反射)
//1.find class
//jclass (FindClass)(JNIEnv, const char);
jclass clazz = (env)->FindClass(env,"com/demo/alipay01/MainActivity");
//2.get method id
//jmethodID (GetMethodID)(JNIEnv, jclass, const char, const char);
jmethodID methodid = (env)->GetMethodID(env, clazz, "showDialog", "(Ljava/lang/String;)V");
//3.call void methoid
//void (CallVoidMethod)(JNIEnv, jobject, jmethodID, ...);
(env)->CallVoidMethod(env, obj, methodid, "yong hu mi ma");
JNI_day02的更多相关文章
随机推荐
- 小程序使用模板template
小程序使用模板template 1.介绍:模板就是代码的高度复用,将在很多页面使用了相同的部分可以使用模板封装 <!-- 在页面组件中使用 --> <!-- 此时定义了一个模板 -- ...
- spark aggregate函数
aggregate函数将每个分区里面的元素进行聚合,然后用combine函数将每个分区的结果和初始值(zeroValue)进行combine操作.这个函数最终返回的类型不需要和RDD中元素类型一致. ...
- 基于postman测试接口(整套接口测试)
基于postman测试接口(整套接口测试) 可以解决的问题 几百个接口人工测试接口过于繁杂 大多测试无法使用请求结果当参数 可以使用随机参数 支持swagger信息导入 随账号持久化保存数据 对集合一 ...
- APM 上报信息分析与应用
在入正题之前我们再回顾下它的架构图: 本文章主要分析AMP各索引的作用,与及结合1.7环境上已接入的服务数据对比后,对索引中的主要字段进行解析.文章分为四个小章节. 1.索引类型 apm索引分为四种类 ...
- jmeter之cookies管理器的使用
作用: 1 发送请求,经常要校验cookies信息 2 针对有的cookie是用的sessionid来进行校验的,这个就需要自己去配置cookie管理器里面的信息,而且sessionid是有时效性的 ...
- php实现ajax请求的方法
php实现ajax请求的方法 Ajax页面:第一,了解底层逻辑,正是平常的1个提交在无刷新的条件下发出请求后完成回应,之后去针对你需要的条件来做动作. <!DOCTYPE html> &l ...
- PowerPC-关闭中断后,还能报sc中断?
https://mp.weixin.qq.com/s/OsHIfPzYUagaTe5J88dIIg 一. 基本问题 FreeRTOS有一个宏,portYIELD_WITHIN_API(), 意 ...
- Chisel3 - Wire & Reg
https://mp.weixin.qq.com/s/Y26N5P4XOr5e3uyi5XQY-w 不同于Verilog,Chisel中Wire和Reg并不是数据类型,而是数据容器,作为数据的一个 ...
- 空格与false
- Nginx 笔记(一)nginx简介与安装
个人博客网:https://wushaopei.github.io/ (你想要这里多有) Nginx 简介: 1.介绍 nginx 的应用场景和具体可以做什么事情 2.介绍什么是反向代理 3.介 ...