二级指针

指向指针变量的指针,保存指针的地址

结构体

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的更多相关文章

随机推荐

  1. java实例化对象的几种方式

    这里一共整理了四种方法 ①用类的new ()创建 ②用clone方法创建, 需要类实现 Cloneable 接口 ③通过反射机制创建 ④将一个对象实例化后,进行序列化,再反序列化 下面是实现代码 1) ...

  2. 【Python代码】混合整数规划MIP/线性规划LP+python(ortool库)实现

    目录 相关知识点 LP线性规划问题 MIP混合整数规划 MIP的Python实现(Ortool库) assert MIP的Python实现(docplex库) 相关知识点 LP线性规划问题 Linea ...

  3. JQuery 高级

    来源于传智播客老师发的笔记 今日内容: 1. JQuery 高级 1. 动画 2. 遍历 3. 事件绑定 4. 案例 5. 插件 JQuery 高级 1. 动画 1. 三种方式显示和隐藏元素 1. 默 ...

  4. BZOJ 1084DP

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2796  Solved: 1391[Submit][Sta ...

  5. 【Mood】出大问题(最近很喜欢说这句话)

    开学两周啦,第一周来了一次开学考,是崩了,还好没公布成绩和排名. 这两周下了一个很大的决心,准备转型/专注文化课,初三一次信息学奥赛比赛后就不学了,先保证能上高中重点班(如果有的话). 因为现在起步太 ...

  6. 关于mobileSelect.js日期数据获取封装,动态时间,封装

    传入起始年份和起始月份 得到 插件的标准格式放到 效果 let getAllDatas = (stime, etime) => { //接收传进来的参数月份 var data_M = etime ...

  7. Vue中计算属性(computed)和监听属性函数watch的比较

    1.计算属性适用的情形我们可能会有这样的需求,一个数据属性在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们最好使用计算属性.例如在下面这个例子中,如果我们使用监听函数,代码就会变得有点冗余. ...

  8. java中String转换成json,json转换成String

    前置添加pom <!-- 配置gson --> <dependency> <groupId>com.google.code.gson</groupId> ...

  9. [优文翻译]003.你应避免的移动开发APP的5个细节(5 Things to Avoid while Developing Your Next Mobile App)

    导读:本文是从<5 Things to Avoid while Developing Your Next Mobile App>这篇文章翻译而来 智能手机的普及带动了大批移动应用的诞生,这 ...

  10. [JavaWeb基础] 005.Hibernate的配置和简单使用

    1.Hibernate简介 Hibernate是一个基于Java的开源的持久化中间件,对JDBC做了轻量的封装.采用ORM映射机制,负责实现Java对象和关系数据库之间的映射,把sql语句传给数据库, ...