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的更多相关文章
随机推荐
- Appium自动化(7) - 控件定位工具之Appium 的 Inspector
如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 上一篇文章介绍了另一块控件定 ...
- ambari添加新的服务出错
错误信息 : raise ExecutionFailed(err_msg, code, out, err) resource_management.core.exceptions.ExecutionF ...
- MySQL的列约束
1.列约束 (1)主键约束——PRIMARY KEY (2)非空约束——NOT NULL 声明了非空约束的列上,不允许使用NULL (3)唯一约束——UNIQUE 声明了唯一约束的列上不能插入重复的值 ...
- 4.1Go if-else
1. Go if-else Golang程序的流程控制决定程序如何执行,主要有三大流程控制,顺序控制.分支控制.循环控制. 条件语句需要定义一个或多个条件,并且对条件测试的true或false来决定是 ...
- 201771010120 苏浪浪 《面向对象程序设计(java)》第11周学习总结
实验十一 集合 1.实验目的与要求 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: (2) 了解java集合框架体系组成: (3) 掌握ArrayList.Lin ...
- HDU4315 Climbing the Hill
题目链接:https://cn.vjudge.net/problem/HDU-4315 知识点: 博弈论 题目大意: \(Alice\) 和 \(Bob\) 轮流指挥 \(N\) 个人爬山,这 \(N ...
- Gym101635C Macarons
题目链接:http://codeforces.com/gym/101635/attachments 题目大意: 给出一个 \(N \times M\) 的网格图,请你用 \(1 \times 1\) ...
- 通过Python扫描代码关键字并进行预警
近期线上出现一个bug,研发的小伙伴把测试环境的地址写死到代码中,在上线前忘记修改,导致线上发布的代码中使用了测试环境地址. 开发过程中虽然有各种规范制度,但是难免有粗心,与其责备不如通过技术手段将问 ...
- A+B Coming(hdu1720)
思考:十六进制的输入->%x,定义时用int.要变成十进制输出,直接在输出时用->%d. #include<stdio.h> int main() { int A,B; cha ...
- 剑指Offer之旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...