JNI_OnLoad方法和RegisterNatives方法的结合
2016-05-23 16:53
471 查看
JNI_OnLoad方法和RegisterNatives方法的结合可以做到更佳方便的注册你的jni方法。
1.在C/C++文件中实现JNI_OnLoad方法。如下:
2.赋值JNINativeMethod数组。JNINativeMethod是用来描述jni方法的结构。
signature :java中name 方法的参数和返回值的描述。
fnPtr :java中name方法在C/C++中的具体实现的方法指针。
3.在JNI_OnLoad中调用RegisterNatives方法,进行注册native方法。
下面是一段代码具体实现的例子:
结尾 :这种方式注册native方法很方便,更改C/C++文件和java文件都不需要用麻烦的javah去编译了。听说JNI_OnUnload方法还可以更改Framework层的模块。小白我还没有试呢。
1.在C/C++文件中实现JNI_OnLoad方法。如下:
jint JNI_OnLoad(JavaVM* pVm, void* reserved) { //your method... <span style="white-space:pre"> </span>return JNI_VERSION_1_6; }(一定要返回版本号,之前看别人博客时看到的,至于为什么,我也不清楚,猜测是C/C++方法中为了标记该方法的调用结果吧)。
2.赋值JNINativeMethod数组。JNINativeMethod是用来描述jni方法的结构。
typedef struct { const char* name; const char* signature; void* fnPtr; } JNINativeMethod;name :java中native方法名。
signature :java中name 方法的参数和返回值的描述。
fnPtr :java中name方法在C/C++中的具体实现的方法指针。
3.在JNI_OnLoad中调用RegisterNatives方法,进行注册native方法。
下面是一段代码具体实现的例子:
jint JNI_OnLoad(JavaVM* pVm, void* reserved) { JNIEnv* env; if ((*pVm)->GetEnv(pVm, (void **)&env, JNI_VERSION_1_6) != JNI_OK) { return -1; } JNINativeMethod nm[8]; nm[0].name = "naInit"; nm[0].signature = "(Ljava/lang/String;)I"; nm[0].fnPtr = (void*)naInit; nm[1].name = "naSetSurface"; nm[1].signature = "(Landroid/view/Surface;)V"; nm[1].fnPtr = (void*)naSetSurface; nm[2].name = "naGetVideoRes"; nm[2].signature = "()[I"; nm[2].fnPtr = (void*)naGetVideoRes; nm[3].name = "naSetup"; nm[3].signature = "(II)I"; nm[3].fnPtr = (void*)naSetup; nm[4].name = "naPlay"; nm[4].signature = "()V"; nm[4].fnPtr = (void*)naPlay; nm[5].name = "naStop"; nm[5].signature = "()V"; nm[5].fnPtr = (void*)naStop; jclass cls = (*env)->FindClass(env, "roman10/tutorial/android_ffmpeg_tutorial02/MainActivity"); //Register methods with env->RegisterNatives. (*env)->RegisterNatives(env, cls, nm, 6); return JNI_VERSION_1_6; }例子出自 :http://pan.baidu.com/s/1gfjTq7L 原项目是在github上,一时找不到链接。这是我保存好的,没有修改。 里面有两个工程,第二个可以用。上面的代码是摘自第二个工程tutorial02.c中的代码。
结尾 :这种方式注册native方法很方便,更改C/C++文件和java文件都不需要用麻烦的javah去编译了。听说JNI_OnUnload方法还可以更改Framework层的模块。小白我还没有试呢。
相关文章推荐
- ASP.NET MVC Form验证
- 深度分析如何在Hadoop中控制Map的数量
- Markdown编辑公式和CSDN-Markdown编辑公式
- hdu 1492(约数的个数)
- NYOJ BOBSLEDDING
- iOS Swift开发之Button(一) button设置tag属性
- JAVA多线程面试50题 -- 内容由浅及深
- 运维人员日常工作(转自老男孩)
- java 数据采集
- android简单服务Service
- SVN FAQ
- How Many Maos Does the Guanxi Worth
- 特征选择和特征理解
- C#中AppDomain.CurrentDomain.BaseDirectory及各种路径获取方法
- ftp ftpclient异常解决、远程命令已经错误代码
- Maven设置项目java默认编译版本
- 数据库使用NULL对于效率有什么影响
- C#实现发送邮件
- 上传图片
- iOS 9 Safari广告拦截插件