没有合适的资源?快使用搜索试试~ 我知道了~
首页Android JNI 浅析
资源详情
资源推荐
Android_JNI
浅析
JNI 是 Java Native Interface 的缩写,JNI 是一种机制,有了它就
可以在 java 程序中调用其他 native 代码,或者使 native 代码调用 java
层的代码。也就是说,有了 JNI 我们可以使 Android 项目中,java 层
与 native 层各自发挥所长并相互配合。如下图所示,JNI 在 Android 中
所处的位置。
好吧谁不知道 JNI 应该在 JAVA 和 Native 的中间呢?
JNI 相对与 native 层来说是一个接口,java 层的程序想访问
native 层,必须通过 JNI,反过来也一样。下面我们来看几个问题。
1,如何告诉 VM(虚拟机)java 层需要调用 native 层的哪些 libs?
我们知道 java 程序是运行在 VM 上的,而 Native 层的 libs 则不然。
所以为了让 java 层能访问 native 层的 libs,必须得告诉 VM 要使用哪
些 native 层的 libs。下面看一段代码
1. publicclassMediaPlayer
2. {
3. ...
4.
5. static{
6. System.loadLibrary("media_jni");
7. native_init();
8. }
9.
10. ...
11.
12. privatenativefinalvoidnative_setup(Objectmediaplayer_this);
13.
14. ...
15. }
可以看到上面的代码中,在 MediaPlayer 类中有一段 static 块包围起来
的代码,其中 System.loadLibrary("media_jni")就是告诉 VM 去加载
libmedia_jni.so 这个动态库,那么这个动态库什么时候被加载呢?因为
static 语句块的原因,所以在 MediaPlayer 第一次实例化的时候就会被
加载了。这段代码中,我们还看到了一个函数 native_init(),该函数被
申明为 native 型,就是告诉 VM 该函数由 native 层来实现。
2,如何做到 java 层到 native 层的映射。
事实上我想表达的意思是,如何完成 java 层的代码到 native 层代
码的映射,例如上面的代码中有一个 native 函数 native_init(),那么如
何使这个函数映射到一个由 C/C++(或者其他语言)实现的具体函数
呢?PS:本菜鸟,表达能力欠缺,不知道大家有没有看明白。
当 VM 执行到 System.loadLibrary()的时候就会去执行 native
libs 中的 JNI_OnLoad(JavaVM* vm, void* reserved)函数,因为
JNI_OnLoad 函数是从 java 层进入 native 层第一个调用的方法,所以
可以在 JNI_OnLoad 函数中完成一些 native 层组件的初始化工作,同
时更加重要的是,通常在 JNI_jint JNI_OnLoad(JavaVM* vm, void*
reserved)函数中会注册 java 层的 native 方法。下面看一段代码:
1. jintJNI_OnLoad(JavaVM*vm,void*reserved)
2. {
3. JNIEnv*env=NULL;
4. jintresult=-1;
5. //判断一下 JNI 的版本ÁÁÁ
6. if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){
7. LOGE("ERROR:GetEnvfailed\n");
8. gotobail;
9. }
10. assert(env!=NULL);
11.
12. if(register_android_media_MediaPlayer(env)<0){
13. LOGE("ERROR:MediaPlayernativeregistrationfailed\n");
14. gotobail;
15. }
16.
17. if(register_android_media_MediaRecorder(env)<0){
18. LOGE("ERROR:MediaRecordernativeregistrationfailed\n");
19. gotobail;
20. }
21.
22. if(register<spanstyle="font-
size:16px;">_android_media_MediaScanner(env)<0){
23. LOGE("ERROR:MediaScannernativeregistrationfailed\n");
24. gotobail;
25. }</span>
26.
27. if(register_android_media_MediaMetadataRetriever(env)<0){
28. LOGE("ERROR:MediaMetadataRetrievernativeregistrationfailed
\n");
29. gotobail;
30. }
31.
32. if(register_android_media_AmrInputStream(env)<0){
33. LOGE("ERROR:AmrInputStreamnativeregistrationfailed\n");
34. gotobail;
35. }
36.
37. if(register_android_media_ResampleInputStream(env)<0){
38. LOGE("ERROR:ResampleInputStreamnativeregistrationfailed\
n");
39. gotobail;
40. }
41.
42. if(register_android_media_MediaProfiles(env)<0){
43. LOGE("ERROR:MediaProfilesnativeregistrationfailed");
44. gotobail;
45. }
46.
47. /*success--returnvalidversionnumber*/
48. result=JNI_VERSION_1_4;
49.
50. bail:
51. returnresult;
52. }
上面这段代码的 JNI_OnLoad(JavaVM* vm, void* reserved)函数实现与
libmedia_jni.so 库中。上面的代码中调用了一些形如
register_android_media_MediaPlayer(env)的函数,这些函数的作用是注册 native
method。我们来看看函数 register_android_media_MediaPlayer(env)的实现。
1. //Thisfunctiononlyregistersthenativemethods
2. staticintregister_android_media_MediaPlayer(JNIEnv*env)
3. {
4. returnAndroidRuntime::registerNativeMethods(env,
5. "android/media/MediaPlayer",gMethods,NELEM(gMethods)
);
1. /*
2. *RegisternativemethodsusingJNI.
3. */
4. /*static*/intAndroidRuntime::registerNativeMethods(JNIEnv*env,
5. constchar*className,constJNINativeMethod*gMethods,intnumMet
hods)
6. {
7. returnjniRegisterNativeMethods(env,className,gMethods,numMetho
ds);
剩余15页未读,继续阅读
huayinboy
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 利用迪杰斯特拉算法的全国交通咨询系统设计与实现
- 全国交通咨询系统C++实现源码解析
- DFT与FFT应用:信号频谱分析实验
- MATLAB图论算法实现:最小费用最大流
- MATLAB常用命令完全指南
- 共创智慧灯杆数据运营公司——抢占5G市场
- 中山农情统计分析系统项目实施与管理策略
- XX省中小学智慧校园建设实施方案
- 中山农情统计分析系统项目实施方案
- MATLAB函数详解:从Text到Size的实用指南
- 考虑速度与加速度限制的工业机器人轨迹规划与实时补偿算法
- Matlab进行统计回归分析:从单因素到双因素方差分析
- 智慧灯杆数据运营公司策划书:抢占5G市场,打造智慧城市新载体
- Photoshop基础与色彩知识:信息时代的PS认证考试全攻略
- Photoshop技能测试:核心概念与操作
- Photoshop试题与答案详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功