JNI编写
2015-11-22 21:37
615 查看
在开发Android的时,有时会有这样的需求。在Java层写代码,写得不尽兴,或者说用Java代码写起来不顺畅。但是换个角度,如果把该部分放到C中去写,就会让人心旷神怡了。甚至极少部分代码就是需要放到C中去写的。
鉴于以上的需求,JNI就找到自己的饭碗了。JNI就是联通Java与C的桥梁。不管是Java向C过度,还是C向Java过度。JNI都是必不可少的。虽然JNI写起来很烦,真的很烦。
JNI怎么写:
首先需要在Java类中定义native方法:
public static Native void test();
此处的test方法是供Java层代码调用的,调用该方法时,会通过jni调用到C层对应的test方法实现。
然后创建C代码文件。主要有以下方式
1、使用Javah命令。
在cmd命令界面将命令符位置调整到对应Android应用的代码路径下:
D:\workspace\应用名\src>javah
-classpath D:\workspace\ 应用名\src\完整包名\类名 -d
d:/ -jni完整包名.类名
实例:
鉴于以上的需求,JNI就找到自己的饭碗了。JNI就是联通Java与C的桥梁。不管是Java向C过度,还是C向Java过度。JNI都是必不可少的。虽然JNI写起来很烦,真的很烦。
JNI怎么写:
首先需要在Java类中定义native方法:
public static Native void test();
此处的test方法是供Java层代码调用的,调用该方法时,会通过jni调用到C层对应的test方法实现。
然后创建C代码文件。主要有以下方式
1、使用Javah命令。
在cmd命令界面将命令符位置调整到对应Android应用的代码路径下:
D:\workspace\应用名\src>javah
-classpath D:\workspace\ 应用名\src\完整包名\类名 -d
d:/ -jni完整包名.类名
实例:
如果是在Java工程中,javah命令如下:
javah -classpath D:\MyProgram\JavaProgram\TestJNIProgram\bin -d d:/ -jni com.test.jni.JniCall
如果是在Android工程中,javah命令如下:
javah -classpath D:\MyProgram\AndroidProgram\TestJNIProgram\bin\classes -d d:/ -jni com.test.jni.JniCall
使用javah命令后,会生成一个C文件,只需要实现C文件中的方法即可。
参考博客:http://www.cnblogs.com/kissazi2/p/3298884.html
2、 直接写。
如果使用前面种方法,次数多了以后,会发现其实每次javah命令生成的文件中,方法名都是有规律的:
JNIEXPORT void JNICALL Java_com_test_jni_JniCall_test (JNIEnv *, jobject); JNIEXPORT 返回类型 JNICALL java_完整包名_类名(JNIEnv *, jobject,参数类型); 这种方法极力不推荐,首先是参数,jni的参数类型和java/c的参数类型是有区别的,还有就是用这用方法写出来的jni方法名很容易出错。所以不推荐使用。 3、在C代码中注册jni方法。 这个方法还是首先需要在java层添加native方法的,只不过不需要javah命令出来的jni方法名那么一长串。注册的方法,方法名遵循C的方法名规范。 步骤如下: 3.1 首先需要重写OnLoad方法 jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* e; (*vm)->GetEnv(vm, (void**) &e, JNI_VERSION_1_4); registerFun(e); return JNI_VERSION_1_4; } 3.2 其次需要实现jni方法注册的方法 static void registerFun(JNIEnv* env) { static JNINativeMethod gMethods[] = { {"native_start", "()I",(void*)native_start}, {"native_stop", "()V",(void*)native_stop}, {"native_ioconnect", "()V",(void*)native_ioconnect}, }; jint nRes = (*env)->RegisterNatives(env, g_clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])); if (nRes < 0) printf("registerFun> RegisterNatives failed!"); } 3.3实现已经注册的jni方法 int native_start(){} void native_stop(){} void native_ioconnect(){} 以上3中方法是本人在工作中使用过的,以第一种最常用。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题