觉得蛮好玩的,就转载来,NDK的开发方式比较适合这种方式

原文地址http://blog.csdn.net/zfzf294990051/article/details/7343468

关于如何实现JNI请参考Android JNI实现步骤


本例想测试一下,绕过硬件抽象层,直接在JNI中调用linux驱动程序。JNI的库有java应用程序加载,也就是本例直接是java应用程序通过JNI调用C程序,再通过C程序直接调用linux驱动程序。

[cpp] view plain copy
  1. #include"com_zhang_jni_test_JNITESTActivity.h"
  2. #include<utils/Log.h>
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<fcntl.h>
  6. #defineLOG_TAG"JNI_C"
  7. #defineDEVICE_NAME"/dev/hello"
  8. intcallDriver();
  9. /*
  10. *Class:com_zhang_jni_test_JNITESTActivity
  11. *Method:nativeMethod
  12. *Signature:()V
  13. */
  14. JNIEXPORTvoidJNICALLJava_com_zhang_jni_test_JNITESTActivity_nativeMethod
  15. (JNIEnv*env,jobjectobj)
  16. {
  17. LOGI("JNIINnativeMethod");
  18. jclasscls=(*env)->GetObjectClass(env,obj);
  19. staticjmethodIDmid=NULL;
  20. if(mid==NULL){
  21. mid=(*env)->GetMethodID(env,cls,"callBack","()V");
  22. if(mid==NULL){
  23. return;
  24. }
  25. }
  26. (*env)->CallVoidMethod(env,obj,mid);
  27. LOGI("JNICALLTheHellodriver");
  28. callDriver();
  29. }
  30. intcallDriver()
  31. {
  32. intfd=-1;
  33. intval=0;
  34. fd=open(DEVICE_NAME,O_RDWR);
  35. if(fd==-1){
  36. LOGI("Failedtoopendevice%s.\n",DEVICE_NAME);
  37. return-1;
  38. }
  39. LOGI("Readoriginalvalue:\n");
  40. read(fd,&val,sizeof(val));
  41. LOGI("%d\n\n",val);
  42. val=5;
  43. LOGI("Writevalue%dto%s.\n",val,DEVICE_NAME);
  44. write(fd,&val,sizeof(val));
  45. LOGI("Readthevalueagain:\n");
  46. read(fd,&val,sizeof(val));
  47. LOGI("%d\n\n",val);
  48. close(fd);
  49. return0;
  50. }
  51. jintJNI_OnLoad(JavaVM*vm,void*reserved)
  52. {
  53. void*venv;
  54. LOGI("JNI_OnLoad!");
  55. if((*vm)->GetEnv(vm,(void**)&venv,JNI_VERSION_1_4)!=JNI_OK){
  56. LOGE("ERROR:GetEnvfailed");
  57. return-1;
  58. }
  59. returnJNI_VERSION_1_4;
  60. }
上述代码中callDriver函数调用驱动程序。

驱动程序需具有一定权限。驱动程序的编写请参考相关书籍。


重新把生成的libInstanceMethodCall.so 考入开发版/system/lib目录下,重新安装原有的应用程序。

输出如下:

[html] view plain copy
  1. I/ActivityManager(1228):Starting:Intent{act=android.intent.action.MAINcat=[android.intent.category.LAUNCHER]flg=0x10200000cmp=com.zhang.jni.test/.JNITESTActivity}frompid1311
  2. I/ActivityManager(1228):Startproccom.zhang.jni.testforactivitycom.zhang.jni.test/.JNITESTActivity:pid=8417uid=10032gids={}
  3. D/dalvikvm(8417):Debuggerhasdetached;objectregistryhad1entries
  4. I/JNI_C(8417):JNI_OnLoad!
  5. V/ZhangFang_JNITEST(8417):ActivitycallNativeMehotd:
  6. I/JNI_C(8417):JNIINnativeMethod
  7. V/ZhangFang_JNITEST(8417):NativemethodcalltheActivitymethods
  8. V/ZhangFang_JNITEST(8417):****************NativeMethodcallbacksuccessfully!********
  9. I/JNI_C(8417):JNICALLTheHellodriver
  10. I/JNI_C(8417):Readoriginalvalue:
  11. I/JNI_C(8417):5
  12. I/JNI_C(8417):
  13. I/JNI_C(8417):Writevalue5to/dev/hello.
  14. I/JNI_C(8417):Readthevalueagain:
  15. I/JNI_C(8417):5
  16. I/JNI_C(8417):
  17. I/ActivityManager(1228):Displayedcom.zhang.jni.test/.JNITESTActivity:+138ms
  18. D/dalvikvm(1311):GC_EXPLICITfreed61K,46%free3160K/5767K,external3137K/3867K,paused25ms

调用驱动成功。


该方法虽然在效率上有点提升,但是不符合android框架,使用时需谨慎。

更多相关文章

  1. android学习日记13--数据存储之ContentProvide
  2. Android/Ophone应用程序数字签名
  3. android中跨进程通讯的4种方式
  4. Android(2.1) Activity的详细讲解
  5. Android(安卓)解析gbk、gb2312编码的xml文件(转)
  6. Android通过JNI调用驱动程序(完全解析实例)
  7. Android(安卓)监听安装和卸载
  8. Forge模型转换和网页浏览在Android上的实践
  9. Android文件下载方式选择

随机推荐

  1. Android(安卓)activity‘s life cycle
  2. android TextView 分散对齐(两端对齐)
  3. Android编程权威指南之Activity的抽象类
  4. 将获取的html源代码格式化输出
  5. Bullet physics 先粘过来后期翻译
  6. Android中Scrollview上滑,顶端部分悬浮
  7. 获取磁盘存储目录
  8. android 状态栏字体颜色设置 黑色 anctiv
  9. android 登陆demo
  10. Wifi定位Gps