催眠术的博客


  • 首页

  • 归档

JNI-局部和全局引用

发表于 2019年01月04日 | 分类于 android | | 阅读次数:

局部引用和全局引用

JNI支持三种引用:局部引用、全局引用和弱全局引用。

局部引用

大多数JNI函数返回局部应用。局部引用不能在后续的调用中被缓存及重用,主要因为它们的使用期限仅限于原生方法,一旦原生函数返回,局部引用即被释放。例如:FindClass 函数返回一个局部引用,当原生方法返回时,它被自动释放,也可以用DeleteLocalRef 函数显式的是否原生代码。

1
2
3
4
5
删除一个局部引用
jclass clazz;
clazz = (*env)->FindClass(env, "java/lang/String");
...
(*env)->DeleteLocalRef(env, clazz);

根据JNI的规范,虚拟机应该允许原生代码创建最少16个局部引用。在单个方法调用时进行多个内存密集型操作的最佳实践是删除未用的局部引用。如果不可能,原生代码可以在使用之前用 EnsureLocalCapacity 方法请求更多的局部引用槽。

全局引用

全局引用在原生方法的后续调用过程中依然有效,除非它们被原生代码显式释放。

  • 1.创建全局引用

可以用 NewGlobalRef 函数将局部引用初始化为全局引用。

1
2
3
4
5
6
7
8
用给定的局部引用创建全局引用
jclass localClazz;
jclass globalClazz;
...
localClazz = (*env)->FindClass(env, "java/lang/String");
globalClazz = (*env)->NewGlobalRef(env, localClazz);
...
(*env)->DeleteLocalRef(env, localClazz);
  • 2.删除全局引用

当原生代码不再需要一个全局引用时,可以随时用 DeleteGlobalRef 函数释放它,如下:

1
2
//删除一个全局应用
(*env)->DeleteGlobalRef(env, globalClazz);

弱全局引用

全局引用的另一种类型是弱全局引用。与全局引用一样,弱全局引用在原生方法的后续调用过程中依然有效,与全局引用不同,弱全局引用并不阻止潜在的对象被垃圾收回。

  • 1.创建弱全局引用

可以用 NewWeakGlobalRef 函数对弱全局引用进行初始化。

1
2
jclass weakGlobalClazz;
weakGlobalClazz = (*env)->NewWeakGlobalRef(env, localClazz);
  • 2.弱全局引用的有效性检验

可以用 IsSameObject 函数检验一个弱全局引用是否仍然指向活动的类实例。

1
2
3
4
5
6
检验弱全局变量是否仍然有效
if(JNI_FALSE == (*env)->IsSameObject(env, weakGlobalClazz, NULL)){
/** 对象仍然处于活动状态且可以使用 */
} else {
/** 对象被垃圾回收器收回,不能使用 */
}
  • 3.删除弱全局引用

可以随时用 DeleteWeakGlobalRef 函数是否弱全局引用。

1
2
3
删除一个弱全局引用

(*env)->DeleteWeakGlobalRef(env, weakGlobalClazz);

全局引用显式释放前一直有效,他们可以被其他原生函数及原生线程使用。

JNI-异常处理

发表于 2019年01月04日 | 分类于 android | | 阅读次数:

异常处理

捕获异常

JNIEnv 接口提供了一组与异常相关的函数集,在运行过程中可以使用Java类查看这些函数。

阅读全文 »

JNI-数据类型

发表于 2019年01月03日 | 分类于 android | | 阅读次数:

JNI的数据类型

Java 中有两种数据类型:

  • 基本数据类型:布尔型、字节型、字符型、短整型、整型、长整型、浮点型和双精度类型。
  • 引用类型:字符串类型、数组类及其他类。
阅读全文 »

Android-NDK结构

发表于 2018年12月28日 | 分类于 android | | 阅读次数:

Android NDK 的结构

  • ndk-build: 该shell脚本是Android NDK构建系统的起始点。
  • ndk-gdb: 该shell脚本允许用GNU调试器调试原生组件。
  • ndk-stack: 该shell脚本可以帮助分析原生组件崩溃时的堆栈追踪
  • build: 该目录包含了Android NDK构建系统的所有模块。
  • platforms: 该目录包含了支持不同Android目标版本的头文件和库文件。
  • samples: 该目录包含了一些示例应用程序,这些程序可以体现Android NDK的性能。
  • sources: 该目录包含了可供开发人员导入到现有的Android NDK项目的一些共享模块。
  • toolchains: 该目录包含目录Android NDK支持的不用目标机体系结构的交叉编译器。Android NDK目前支持ARM、X86 和MIPS机体系结构。Android NDK 构建系统根据选定的体系结构使用不同的交叉编译器。
阅读全文 »

linux下查看监听端口对应的进程

发表于 2018年12月10日 | 分类于 linux | | 阅读次数:

方法一

1.通过lsof命令查看PID
1
2
3
4
5
6
7
8
9
ipv4
[root@test proc]# lsof -Pnl +M -i4
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
java 1419 1401 10u IPv4 6793357 TCP *:8453 (LISTEN)
AutonomyD 6147 1401 6u IPv4 7597365 TCP *:20003 (LISTEN)
AutonomyD 6147 1401 14u IPv4 7597369 TCP *:20000 (LISTEN)
也可以使用:
[root@test proc]# lsof -Pnl +M -i4|grep 8453
java 1419 1401 10u IPv4 6793357 TCP *:8453 (LISTEN)
1
2
3
4
5
6
7
8
9
10
11
12
ipv6
[root@test proc]# lsof -Pnl +M -i6
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
java 1419 1401 286u IPv6 7616547 TCP 192.168.1.29:55829->192.168.1.17:7001 (CLOSE_WAIT)
java 1419 1401 290u IPv6 6987470 TCP 192.168.1.29:33836->192.168.1.154:1521 (ESTABLISHED)
java 1419 1401 297u IPv6 6793642 UDP *:1133
java 1419 1401 304u IPv6 6987472 TCP 192.168.1.29:33838->192.168.1.154:1521 (ESTABLISHED)
java 1419 1401 306u IPv6 6987479 TCP 192.168.1.29:33839->192.168.1.154:1521 (ESTABLISHED)
java 1419 1401 307u IPv6 7006208 TCP 192.168.1.29:60340->192.168.1.154:1521 (ESTABLISHED)
也可以使用:
[root@test proc]# lsof -Pnl +M -i6|grep 5001
java 12886 0 530u IPv6 6988341 TCP *:5001 (LISTEN)
阅读全文 »

wireshark过滤器规则

发表于 2018年12月10日 | 分类于 linux | | 阅读次数:

一、IP过滤:包括来源IP或者目标IP等于某个IP

比如:

1
2
3
ip.src addr==192.168.0.208  or ip.src addr eq 192.168.0.208 显示来源IP

ip.dst addr==192.168.0.208 or ip.dst addr eq 192.168.0.208 显示目标IP

二、端口过滤:

比如:

1
2
3
4
5
6
7
8
9
 tcp.port eq 80 // 不管端口是来源的还是目标的都显示
tcp.port == 80
tcp.port eq 2722
tcp.port eq 80 or udp.port eq 80
tcp.dstport == 80 // 只显tcp协议的目标端口80
tcp.srcport == 80 // 只显tcp协议的来源端口80

过滤端口范围
tcp.port >= 1 and tcp.port <= 80

三、协议过滤:tcp

1
2
3
4
5
6
7
8
9
10
11
12
udp
arp
icmp
http
smtp
ftp
dns
msnms
ip
ssl
等等
排除ssl包,如!ssl 或者 not ssl

四、包长度过滤:

比如:

1
2
3
4
udp.length == 26 这个长度是指udp本身固定长度8加上udp下面那块数据包之和
tcp.len >= 7 指的是ip数据包(tcp下面那块数据),不包括tcp本身
ip.len == 94 除了以太网头固定长度14,其它都算是ip.len,即从ip本身到最后
frame.len == 119 整个数据包长度,从eth开始到最后

五、http模式过滤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
例子:
http.request.method == “GET”
http.request.method == “POST”
http.request.uri == “/img/logo-edu.gif”
http contains “GET”
http contains “HTTP/1.”

// GET包
http.request.method == “GET” && http contains “Host: ”
http.request.method == “GET” && http contains “User-Agent: ”
// POST包
http.request.method == “POST” && http contains “Host: ”
http.request.method == “POST” && http contains “User-Agent: ”
// 响应包
http contains “HTTP/1.1 200 OK” && http contains “Content-Type: ”
http contains “HTTP/1.0 200 OK” && http contains “Content-Type: ”
一定包含如下
Content-Type:

六、连接符 and / or

七、表达式:

1
!(arp.src==192.168.1.1) and !(arp.dst.proto_ipv4==192.168.1.243)

git submodule的使用

发表于 2018年12月10日 | 分类于 git | | 阅读次数:

添加

为当前工程添加submodule,命令如下:

1
git submodule add 仓库地址 路径

其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能顺利 clone)

命令执行完成,会在当前工程根路径下生成一个名为“.gitmodules”的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。

删除

submodule的删除稍微麻烦点:首先,要在“.gitmodules”文件中删除相应配置信息。然后,执行“git rm –cached ”命令将子模块所在的文件从git中删除。

下载的工程带有submodule

当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:

1
git submodule update --init --recursive

即可将子模块内容下载下来后工程才不会缺少相应的文件。

Android.mk简介

发表于 2018年12月07日 | 分类于 android | | 阅读次数:

Android.mk简介

跳转链接

Sublime快捷键

发表于 2018年08月15日 | 分类于 mac | | 阅读次数:

Sublime快捷键

阅读全文 »

Vim Cheat Sheet

发表于 2018年05月18日 | 分类于 linux | | 阅读次数:

光标

  • h - 左移光标
  • j - 下移光标
  • k - 上移光标
  • l - 右移光标
  • w - 移动到下个单词开头
  • W - 移动到下个单词开头(单词含标点)
  • e - 移动到下个单词结尾
  • E - 移动到下个单词结尾(单词含标点)
  • b - 移动到上个单词结尾
  • B -移动到上个单词结尾(单词含标点)
  • O - 移动到行首
  • ^ - 移动到行首的非空白符
  • $ - 移动到行尾
  • G - 移动到文档末行行首
  • {n}G - 移动到第{n}行

Tip: 命令前追加数字表示命令的重复次数,比如5j表示向下移动4行

阅读全文 »
1…456…10
催眠术

催眠术

催眠术的技术博客

98 日志
23 分类
79 标签
© 2022 催眠术
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4