1.MediaScanner.java加载jni库
![](https://img.haomeiwen.com/i10649299/871d1729d6d83c0b.jpg)
2.native_init函数获取java层mNativeContext成员FieldID
![](https://img.haomeiwen.com/i10649299/f3da675a74c240b1.jpg)
3.native_setup函数保存c层MediaScanner对象指针到java层,便以后使用
![](https://img.haomeiwen.com/i10649299/a825016988a2e376.jpg)
3.c层processDirectory负责目录扫描工作
![](https://img.haomeiwen.com/i10649299/aff28bd0c682041a.jpg)
![](https://img.haomeiwen.com/i10649299/9800252553b3babb.jpg)
4.总结
java层习惯在init时,在native层new一个c对象,并将其对象指针保存在自己的整型成员中,当调用其他native函数时可以从java层获取该指针,简言之:native层对象由java层管理。
附:当JNIEnv不作为参数传入时,JNI提供了如下两个函数获得,
AttachCurrentThread和GetEnv.
在Android系统中,当在一个线程中调用AttachCurrentThread后,如果不需要用时一定要做DetachCurrentThread处理,否则线程无法正常退出。
网友评论